簡體   English   中英

這樣一個復雜的函數來測試變量是否不為零有什么好處?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM