【问题标题】:Difference between ANDing with bitwise shift and hex values [closed]与按位移位和十六进制值进行与运算之间的区别[关闭]
【发布时间】:2016-07-01 18:54:21
【问题描述】:

如果我想将一个值的第 2 位设置为0,以下两者有什么区别:

value = value & (1<<2);
value = value & 0x2;

【问题讨论】:

  • 不同之处在于它们设置了不同的位。 (1 &lt;&lt; 2) == 0x4 认为关闭是一个错字。
  • 啊,我以为我明白了..
  • 你是如何编号的? IE。第一位是 0 还是 1?

标签: c bit-manipulation bit-shift bitwise-and


【解决方案1】:

当使用按位 AND 时,您会清除未在掩码中设置的 所有 位。所以你实际上只保留了一点。如果您只想清除一个,请将所有位设置为 1 除了您想要的那个。您可以使用~ 运算符来反转掩码中的所有位,如下所示:

value = value & ~(1<<2);
value = value & ~(0x2);

也就是说,这两个语句清除了不同的位。在第一种情况下,1&lt;&lt;2 的计算结果为 4,即000001000x04。在第二种情况下,0x200000010。它们的反转分别是1111101111111101

【讨论】:

  • 问题是“设置为0”,而不仅仅是“设置”。
  • @melpomene 很好。已编辑。
【解决方案2】:

正式回答

严格来说,如果您使用的是LSB,那么首先形成value = value &amp; (1&lt;&lt;2);,等于(伪,或使用GNU 扩展,允许二进制常量的代码)value = value &amp; 0b100; 将设置为0 除第 2 位之外的所有位,第二种形式 value = value &amp; 0x2;(或 value = value &amp; 0b10;)将设置为 0除第 1 位之外的所有位。所以最后第二种形式会做你想要的 - 设置为0 bit 2(连同许多其他位,但谁在乎我们是否完全按照它写的那样回答你的问题?)。 请注意,如果您在 MSB 世界中,则它们都将设置为 0 bit 2

非正式回答

如果,不管你如何表达你的问题,你实际上想知道使用移位操作的常量表达式和常量字面量之间是否有区别,那么答案是否定的,没有区别 - 编译器会将 expression (1&lt;&lt;2) 评估为 @ 987654331@ 在编译时

dbush 的回答中描述了如何正确地将一位设置为0

【讨论】:

  • 问题中的代码使用0x2,而不是4
  • @melpomene 是的,这已经被其他人指出了,我想解决关于常量表达式与 shift 和常量之间区别的实际问题
猜你喜欢
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多