c - 为什么一个复杂的位移命令不像某些具有相同逻辑的命令那样起作用?

标签 c bit-manipulation byte bit-shift bit

例如,对于这些类似的代码,当我像第一个模式那样编写时,条件为真,而在第二个模式中,条件为假。

我在调试器工具中实时观察了 mask & (bits >> i)mask 的值,虽然它们是相同的,但返回的条件错误。

为什么会发生这种奇怪的行为?

1:

void printLetters(unsigned int bits, unsigned int i) // 0<i<7
{
   unsigned int mask = 0x1;
   unsigned temp;

   temp = mask & (bits >> i);
   if (temp == mask) //the same condition in other way
        printf("true");
}

2:

void printLetters(unsigned int bits, unsigned int i) // 0<i<7
{
   unsigned int mask = 0x1;

   if (mask & (bits >> i)== mask) //the same condition in other way
       printf("true");`
}

最佳答案

等于运算符==的优先级高于按位与运算符&

在第一种情况下,临时变量 temp 得到了正确的值,随后的比较给出了正确的结果。

在第二个例子中,比较发生在之前,比较结果与mask按位相加。

因为比较只给出 1 或 0 分别表示 true 或 false,如果设置了 (bits >> i) 的位 0,结果将始终为 true(使用 mask= =0x1) 和 false else.

要运行的代码必须使用括号来更改求值顺序,如下所示:

void printLetters(unsigned int bits, unsigned int i) // 0<i<7
{
   unsigned int mask = 0x1;

   if ( (mask & (bits >> i)) == mask) //note brackets
       printf("true");`
}

关于c - 为什么一个复杂的位移命令不像某些具有相同逻辑的命令那样起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50787801/

相关文章:

c# - 组枚举成员?

c - 求 k 素数的个数;

c - 嵌入式 C - 使用 "volatile"断言一致性

c - 为字符串数组分配内存

c++ - 什么是 0xFF,为什么要移位 24 次?

java - 将文件内容读取为字节 java

c - 为什么我们不应该在printf语句中传递程序的输入呢?

java - 为什么它会得到这样的一点呢?

arrays - nodejs从缓冲区数据到字节数组的转换

Java 正则表达式花费的时间太长