x^y
是x XOR y
,結果有1位x和y不同,0爲比特它們是相同的:
x = 01010011
y = 00010011
x^y = 01000000
^(X^y)的否定此,即你得到0爲他們是不同的位和1否則:
^(x^y) = 10111111 => z
然後,我們開始移動z到右邊掩蓋其自己的位。移位焊盤的數量的左側用零個比特:
z >> 4 = 00001011
隨着z
傳播任何零到結果的目標,開始與運算:
z = 10111111
z >> 4 = 00001011
z & (z >> 4) = 00001011
也摺疊的新值來移動任何零向右:
z = 00001011
z >> 2 = 00000010
z & (z >> 2) = 00000010
進一步折到最後一位:
z = 00001010
z >> 1 = 00000001
z & (z >> 1) = 00000000
在另一方面,如果你有x == y
最初,它是這樣的:
z = 11111111
z (& z >> 4) = 00001111
z (& z >> 2) = 00000011
z (& z >> 1) = 00000001
所以它真的返回1時x == y
,否則爲0。
通常,如果x和y都爲零,則比較可以比其他情況花費更少的時間。該函數試圖使所有調用都是相同的時間,而不管其輸入的值如何。這樣,攻擊者就不能使用基於時間的攻擊。