我今天在一些同事的代码中看到了类似的东西:
I2C1ADB1= (slave_read_address | 0x01);
这是什么? 0x01部分呢?它在位末尾是否以1结尾?
假设I2C1ADB1 = 0b00000000。如果我在上面的行中使用,新的I2C1ADB1是否为0b000000001?还会将位数从8增加到9吗?
答案 0 :(得分:2)
'|'是C语言中的按位“或”运算符。它在两个值之间进行按位“或”运算并返回最终值。
I2C1ADB1= (slave_read_address | 0x01);
假定二进制的slave_read_address是0bxxxxxxxx
,其中每个x
是位值1
或0
。同样,二进制文件中的0x01
是0x00000001
。
您知道,如果至少一个值是true (1)
,则OR会返回true (1)
。否则返回false (0)
。
因此在上面的C行之后,I2C1ADB1将具有0bxxxxxxx1
。
操作员不会添加位。通常为“ |” (OR)运算符用于设置一组特定的位,而不会更改其他位。
答案 1 :(得分:1)
语句I2C1ADB1 = (slave_read_address | 0x01);
将slave_read_address
的值存储到I2C1ADB1
中,将低位强制为1
。
您的解释不正确,该值没有移位,没有附加任何附加位 。最低位被设置到1
:
0
成为1
,1
不变,2
成为3
,3
不变,4
成为5
,答案 2 :(得分:0)
因为在左边有一个变量,在右边有一个常数,结果是将变量中的常数设置为所有对应的1位。在这种情况下,您是对的:它设置了最后一位。没有计数增加!