Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 位操作(移位)_C_Bits - Fatal编程技术网

C 位操作(移位)

C 位操作(移位),c,bits,C,Bits,我正在看一段代码,它可以: int result = 0 ; char byte = foo[j] for (i = 7 ; i>0 ; i--) { byte = (byte & ~0x1)>>1 ; result+= array[i] * (byte & 1) ; } 我知道这段代码的目的是将数组中的元素相乘,其中字节中的对应位设置为1 我不明白为什么~0x1是必需的,因为每次我都只考虑最后一点 有什么想法吗?(byte&~0x1)>>1和by

我正在看一段代码,它可以:

int result = 0 ;
char byte = foo[j]
for (i = 7 ; i>0 ; i--) {
   byte = (byte & ~0x1)>>1 ;
   result+= array[i] * (byte & 1) ;
}
我知道这段代码的目的是将数组中的元素相乘,其中字节中的对应位设置为1

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

有什么想法吗?

(byte&~0x1)>>1
byte>>1
都将字节右移1位。
区别在于
(byte&~0x1)>>1只考虑字节的最低8位,而
byte>>1不再考虑。
当字节实际上是一个字节时,它们是相同的。
或者字节只是int(long int)类型的名称,它们非常不同。

(byte&0xFF)>>1
(byte&0x1)>>1具有相同的功能

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

是什么让您认为“
(byte&~0x1)>>1
只处理字节的最低8位”@RSahu您是对的。我假设“~0x1”常量的类型是byte。看了C标准后,我发现“~0x1”常量有一个默认的int类型。也许你可以只使用一个无符号字符并跳过该位……进一步解释一下:正(或零)值的右移必须在左边引入零位。但是右移一个负值,它的实现定义了会发生什么。因此,理论上,编译器可以使用rotate指令,当且仅当它知道
byte
有负值时。此外,依赖这种行为是一个可怕的想法,因为其他编译器(或同一编译器的其他版本)可能会有不同的做法。C标准不允许用轮换替换移位,唯一的极端情况是移位一个负整数(结果是实现定义的),负数移位(未定义行为)和大于操作数大小的移位(未定义行为)。