位操作(移位)

Bit manipulation (shifting)

我正在查看一段代码:

int result = 0 ;
char byte = foo[j]
for (i = 7 ; i>0 ; i--) {
   byte = (byte & ~0x1)>>1 ;
   result+= array[i] * (byte & 1) ;
}

我知道这段代码objective是将byte中对应位设置为1的数组元素相乘

我不明白为什么 ~0x1 是必需的,因为每次我都只考虑最后一点

有什么想法吗?

(byte & ~0x1)>>1byte>>1 都将字节右移 1 位。
不同的是(byte & ~0x1)>>1只关心字节的低8位,而byte>>1不关心。
当byte真的是一个BYTE时,它们是一样的
或者byte只是一个int(long int)类型的名字,它们有很大的不同。
(byte & 0xFF) >> 1(byte & ~0x1) >>1 具有相同的功能。

某些编译器通过旋转位而不是移动位来实现>>。这可以防止这种情况(如果最后一位设置为 0,那么即使移位实现为旋转,答案也将保持正确)