反转数组元素(按位)不起作用
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)){
我今天尝试反转数组元素,但没有成功。有没有理由,例如
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)){