【问题标题】:Testing values with & 1<<0?测试值 & 1<<0?
【发布时间】:2019-03-18 21:40:03
【问题描述】:

我是位操作的新手,我偶然发现了一些有趣的东西。假设如下:

unsigned char A;
unsigned char B;

if(A & 1 << 0){
    //testing
}

为什么总是需要variable &amp; 1&lt;&lt;0? 是否有不需要这样做的情况? 假设我们有:

unsigned char temp;
temp = ~A & ~B;

我们正在寻找测试温度。单独测试 temp 与仅使用 temp &amp; 1&lt;&lt;0 测试位 0 有什么区别?

谢谢!

【问题讨论】:

  • 谁告诉你一定要那样做的?
  • 这从来都不是必需的,我宁愿不鼓励这样做。这是毫无意义的,并且会使您的代码难以理解。如果你想检查你的变量的奇怪性,那么只需测试x &amp; 1
  • 1 &lt;&lt; 0 有时用于代码一致性,在测试多个位时,例如。 G。 if(A &amp; 1 &lt;&lt; 0){/*foo*/} else if(A &amp; 1 &lt;&lt; 1){/*bar*}。当您在新行上编写每个测试时,测试看起来会更加一致。
  • 明白你显示的是UB,因为你的变量都没有被初始化。
  • @yano 这显然是一个伪代码示例,他不是询问测试结果,而是询问是否需要左移。 AB 未定义/已定义不会改变任何事情。别吹毛求疵了。

标签: c bitwise-operators bitwise-and


【解决方案1】:

1&lt;&lt;0 无意义,左移 1 个零位无效。

1&lt;&lt;0 == 1

下面的工作相同

unsigned char A;
unsigned char B;

if(A & 1){
    //testing
}

是单个&amp; 使它成为按位运算,而不是左移 (&lt;&lt;) 运算

例如,如果您想测试第 7 位,您可以通过两种方式进行:

if (A & 128) {

if (A & (1<<7)) {

在后者的情况下,因为它使用常量值,编译器会简单地将其分解为 128 并完全避免 shl,所以这完全取决于你想根据代码和你的编码风格。

【讨论】:

  • 这是一个很好的例子!谢谢你,先生!
猜你喜欢
  • 2020-03-08
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2019-02-15
  • 2010-11-18
  • 1970-01-01
  • 2017-12-08
相关资源
最近更新 更多