C 右移位后对无符号字符对象使用位AND运算符意味着什么?

C 右移位后对无符号字符对象使用位AND运算符意味着什么?,c,bitwise-operators,byte-shifting,C,Bitwise Operators,Byte Shifting,我试图理解以下代码片段: unsigned char state = portStates[portNumber]; int bitValue = (state >> 7) & 0x1; 它是按位执行的,在 状态,对吗?如果返回true(即,该位已设置),则 这个数字是奇数。否则,就更糟了。我说得对吗 谢谢 只需将状态移位7位即可。然后删除除第一个位以外的所有其他位 因此,将值的第7位(在大多数系统中,无符号字符为8位的最有效位)转换为0或1。它可以写成布尔表达式(使用惯用

我试图理解以下代码片段:

unsigned char state = portStates[portNumber];
int bitValue = (state >> 7) & 0x1;
它是按位执行的,在
状态
,对吗?如果返回true(即,该位已设置),则 这个数字是奇数。否则,就更糟了。我说得对吗

谢谢

只需将
状态
移位7位即可。然后删除除第一个位以外的所有其他位

因此,将值的第7位(在大多数系统中,
无符号字符
为8位的最有效位)转换为0或1。它可以写成布尔表达式(使用惯用的双重否定):

但移位和掩蔽直接给出0或1值,而不转换为布尔值

只需将
状态
移位7位即可。然后删除除第一个位以外的所有其他位

因此,将值的第7位(在大多数系统中,
无符号字符
为8位的最有效位)转换为0或1。它可以写成布尔表达式(使用惯用的双重否定):

但是移位和掩蔽直接给出0或1值,而不转换为bool。

(state>>7)返回通过将无符号字符“state”移位7位并添加前导零而生成的值。现在,使用1执行and操作将给出状态中第七位的值

也就是说,如果状态的第七位(从右侧)为1,则bitValue为1,或者换句话说,如果状态>=128,则bitValue为1。

(状态>>7)返回通过将无符号字符“状态”移位7位并添加前导零而生成的值。现在,使用1执行and操作将给出状态中第七位的值



也就是说,当状态的第七位(从右侧)为1时,bitValue为1,或者换句话说,当状态>=128时,bitValue为1。

它只是测试值的第七位。奇数或偶数将是位0,而不是位7。这只是从状态中提取第7位,不多也不少。是的,这提取了状态的第7位。如果位7为1,则返回1。否则为0。不移动对象。取其值,并将该值移位,然后使用
1
按位和结果值。然后将结果值视为布尔值,并将其分配给整数对象,这会更容易理解吗?它只是测试值的第7位。奇数或偶数将是第0位,而不是第7位。这只是从状态中提取第7位,不多也不少。是的,这提取了状态的第7位。如果位7为1,则返回1。否则为0。不移动对象。取其值,并将该值移位,然后使用
1
按位和结果值。然后将结果值视为布尔值,并将其分配给整数对象,这会更容易理解吗?在现代通用CPU上,1字节总是8位。有很多。我可能会删除最后一点,这是过度的回答,只是说:“不要这样做”。我知道1字节并不总是8位,但找不到那个引用。好吧,添加&0x1没有什么坏处。好吧,您可以添加,通常这是MSB(而不是OP认为的LSB);)难道不是
bitvalue=state>127吗?1 : 0;更具可读性——让编译器决定如何优化?@DavidC.Rankin
state>127?1:0
在功能上与
(状态>>7)和0x1
字符位>8
的特殊情况下有所不同。在现代通用CPU上,1字节始终是8位。有很多。我可能会删除最后一点,这是过度的回答,只是说:“不要这样做”。我知道1字节并不总是8位,但找不到那个引用。好吧,添加&0x1没有什么坏处。好吧,您可以添加,通常这是MSB(而不是OP认为的LSB);)难道不是
bitvalue=state>127吗?1 : 0;更具可读性——让编译器决定如何优化?@DavidC.Rankin
state>127?1:0
(状态>>7)和0x1
在异常情况下的功能不同,当
字符位>8
时。对,Chux!编辑了答案。对,楚克斯!编辑了答案。
int bitValue = (state >> 7) & 0x1;
int bitValue = !!(state & 0x80);