gpt4 book ai didi

c - 这样一个复杂的函数来测试变量是否不为零有什么好处?

转载 作者:行者123 更新时间:2023-12-03 20:04:00 25 4
gpt4 key购买 nike

我正在撰写关于为后量子安全签名编写的代码的硕士论文(计算机科学)。整个事情都可以找到here但在这里并不重要。在我的论文中,我试图解释一个“简单”的函数,它根本不是那么简单。
该函数测试 中的变量是否为非零GF(16)。 (这里的GF(16)可以理解为4位无符号整数)。该函数如下所示:

static inline uint8_t gf16_is_nonzero(uint8_t a) {
unsigned a4 = a & 0xf; // mask lowest 4 bits of a
unsigned r = 0u - a4; // set 4 high bits if a is nonzero
r >>= 4; // right-shift high bits into low bits
return r & 1; // return lowest bit
}
我明白它是如何工作的,但我不明白为什么这个功能需要这么复杂。这有什么好的理由吗?很好的理由可能是性能或安全性(例如,针对定时攻击的安全性)的好处。因为如果没有这样的好处,那么以简单的方式编写该函数不是更聪明,例如:
static inline uint8_t gf16_is_nonzero(uint8_t a) {
return (a & 15) != 0;
}
编辑
这段代码不是我写的,而是由加密研究人员编写的,他们试图让 NIST 标准化他们的 PQ 算法。
TonyDelroy 在评论中为第二个代码片段建议了一种更简单的方法。

最佳答案

这个代码的原因是因为它是无分支 .
测试条件往往是一项昂贵的操作,而加法、减法和按位运算符则不然。
然而,这是过早的优化。与 -O3 ,第一个函数编译为:

andl    $15, %edi
negl %edi
shrl $31, %edi
movl %edi, %eax
ret
虽然第二个函数编译为:
andl    $15, %edi
setne %al
ret
这个故事的寓意是:编写清楚地说明您的意图的代码,让编译器解决其余的问题。

关于c - 这样一个复杂的函数来测试变量是否不为零有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63586962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com