反转数组元素(按位)不起作用

Inverting array elements (bitwise) doesn't work

我今天尝试反转数组元素,但没有成功。有没有理由,例如

uint8_t array[2] = {0xFF,0x0A};
...
if( 0xF5 == ~(array[1]){
   // never got here
}

不起作用?编译器没有显示任何错误。

if(0xF5 == ~(array[1]))

发生这种情况是因为 array[1] 在应用反转之前被提升为 int。因此,当您对 array[1] 的提升值应用反转时,您会得到:0xFFFFFFF5,它不等于 0x000000F5

如前所述,如果要进行比较,可以将相等运算符右侧的表达式转换为 uint8_t

C 在执行整数运算时将整数类型提升为 int(或更大)。为了得到你想要的值,你可以在比较之前将按位补码的结果向下转换为uint8_t,如下:

if (0xF5 == (uint8_t) ~array[1]) {
    ...
}

~(array[1]) 计算为 ~(0x0A)。在 int 为 32 位数字的平台上,由于整数提升,它等同于 ~(0x0000000A),与 0xFFFFFFF5 相同。

因此,0xF5 == ~(array[1]) 转换为 0xF5 == 0xFFFFFFF5,显然计算结果为 false。

为了使您的比较有效,您可以使用另一个按位运算符。

if( 0xF5 == (~(array[1]) & 0xFF) )

这确保 == 运算符的 RHS 上除了最后一位提升整数之外的所有内容都被清零。

使用:

if (0xF5 == (uint8_t)~(array[1])){

或:

if (0xF5 == (~(array[1]) & 0xFF)){