[英]What could be the benefit of such a complicated function to test if variable is not zero?
我正在撰寫關於為后量子安全簽名編寫的代碼的碩士論文(計算機科學)。 整個事情都可以在這里找到,但在這里並不重要。 在我的論文中,我試圖解釋一個“簡單”的函數,它根本不是那么簡單。
該函數測試,如果一個變量在伽羅瓦域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
這個故事的寓意是:編寫清楚地說明您的意圖的代碼,讓編譯器解決其余的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.