【问题标题】:What does using bit wise AND operator on a unsigned char object after right shifting it mean?对 unsigned char 对象右移后使用按位 AND 运算符是什么意思?
【发布时间】:2018-04-18 08:24:08
【问题描述】:

我正在尝试理解以下代码的 sn-p:

unsigned char state = portStates[portNumber];
int bitValue = (state >> 7) & 0x1;

它在最不重要的位上进行按位与 state,对吧?如果它返回真(即该位被设置),那么 数字是奇数。否则,它是均匀的。我说的对吗?

谢谢

【问题讨论】:

  • 它只是测试值的第 7 位。
  • 奇数甚至是位 0,而不是位 7。这只是从状态中提取位 #7,仅此而已。
  • 是的,这会提取状态的第 7 位。如果第 7 位为 1,则返回 1。否则为 0。
  • 你不会移动一个对象。您获取它的 value,然后将该 value 移位,然后将得到的 value1 进行位与运算。然后将生成的 value 视为布尔值并将其分配给整数 object
  • the_naive,如果代码是int bitValue = (state /128) %2;,会更容易理解吗?

标签: c bitwise-operators byte-shifting


【解决方案1】:
int bitValue = (state >> 7) & 0x1;

只需将state 移动 7 位。然后它会删除除第一个之外的所有其他位。

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

int bitValue = !!(state & 0x80);

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

【讨论】:

  • 现代 通用 CPU 上的 1 个字节总是 8 位。有很多modern stuff where it need not be true
  • 我可能会删除最后一点,这是过度回答,只是说:“不要这样做”。我有那个 1 字节并不总是 8 位,但找不到那个参考。好吧,添加 & 0x1 并没有什么坏处。
  • 好吧,你可以补充一下,通常这是 MSB(而不是 OP 认为的 LSB);)
  • bitvalue = state > 127 ? 1 : 0; 会不会更具可读性——让编译器决定如何优化?
  • @DavidC.Rankin state > 127 ? 1 : 0 在功能上与 (state >> 7) & 0x1 不同,在 CHAR_BIT > 8 的特殊情况下。
【解决方案2】:

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

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

【讨论】:

  • 对,楚克斯!编辑了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 2013-05-07
  • 1970-01-01
  • 2011-06-12
相关资源
最近更新 更多