位操作(移位)
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)>>1
和 byte>>1
都将字节右移 1 位。
不同的是(byte & ~0x1)>>1
只关心字节的低8位,而byte>>1
不关心。
当byte真的是一个BYTE时,它们是一样的
或者byte只是一个int(long int)类型的名字,它们有很大的不同。
(byte & 0xFF) >> 1
与 (byte & ~0x1) >>1
具有相同的功能。
某些编译器通过旋转位而不是移动位来实现>>。这可以防止这种情况(如果最后一位设置为 0,那么即使移位实现为旋转,答案也将保持正确)
我正在查看一段代码:
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)>>1
和 byte>>1
都将字节右移 1 位。
不同的是(byte & ~0x1)>>1
只关心字节的低8位,而byte>>1
不关心。
当byte真的是一个BYTE时,它们是一样的
或者byte只是一个int(long int)类型的名字,它们有很大的不同。
(byte & 0xFF) >> 1
与 (byte & ~0x1) >>1
具有相同的功能。
某些编译器通过旋转位而不是移动位来实现>>。这可以防止这种情况(如果最后一位设置为 0,那么即使移位实现为旋转,答案也将保持正确)