参照《深入理解计算机系统(原书第三版)》习题3.26
long fun_a(unsigned long x)
{
long val = 0;
while (x){
val ^= x;
x >>= 1;
}
return val & 0x1;
}
如果x中有奇数个1就返回1,偶数个1就返回0。
右移操作会在最高位补零。
该算法的本质是将x的最后一位(红框)与向前到最高位的1为止的所有数(绿框)逐个做异或操作。
由于异或运算满足交换律和结合律,所以该操作等于将x从最高位1向后的所有数都做异或
val = 1 ^ 1 ^ 1 ^ 0 ^ 1;
汇编代码
fun_a(unsigned long):
; x in %rdi
xorl %eax, %eax ;置零
testq %rdi, %rdi
je .L4
.L3:
xorq %rdi, %rax
shrq %rdi
jne .L3
andl $1, %eax
ret
.L4:
ret