关于无符号char右移后按位与操作含义及代码逻辑的验证问询
关于无符号char位操作的疑问解答
1. 无符号char右移后按位与的含义
咱们拆解下这两个操作的核心作用:
- 无符号右移(
>>):对于unsigned char(8位二进制数),这是逻辑右移——所有位向右移动指定位数,左边空位用0填充,不会像有符号数那样用符号位补位。比如0b10000000右移7位后,会变成0b00000001。 - 按位与(
&):和0x1(二进制0b00000001)做按位与,本质是提取最低位的状态——只有最低位和1相与能保留原值,其他位和0相与都会变为0,最终结果只能是0或1。
把两者结合,就是把目标位移动到最低位,然后单独提取该位的0/1状态,这是嵌入式或底层代码里常用的“位提取”技巧。
2. 你对代码的理解是否正确?
很遗憾,你的理解有偏差哦,咱们来逐行分析这段代码:
unsigned char state = portStates[portNumber]; int bitValue = (state >> 7) & 0x1;
state >> 7:是把state的**最高位(第7位,8位二进制数从0开始计数,0是最低位,7是最高位)**向右移动7位,挪到最低位的位置。- 再和
0x1相与,最终得到的是state最高位的0/1值,而不是最低位。
如果要判断state是奇数还是偶数,应该提取最低位,代码可以写成:
int isOdd = state & 0x1; // 结果为1则是奇数,0则是偶数
或者等价的(state >> 0) & 0x1,不过直接写state & 0x1是更简洁的写法。
内容的提问来源于stack exchange,提问作者the_naive
相关产品推荐
相关产品推荐

