c - 按位运算设置十进制变量

标签 c bit-manipulation

我使用按位运算编写了一个简单的程序。

#include <stdio.h>
int main ()
{
    int pos;
    unsigned int aaregister = 0;
    unsigned int result = 1;
    aaregister = aaregister|(1 << 0);
    printf("|0: %02X \n", aaregister);
    aaregister = aaregister | 1 << 1;
    printf("|1: %02X \n", aaregister);
    aaregister = aaregister | 0 << 2;
    printf("|2: %02X \n", aaregister);
    aaregister = aaregister | 1 << 3;
    printf("|3: %02X \n", aaregister);
    for (pos = 3; pos>=0;pos--) 
    {
         result = result & (aaregister & (1 >> pos));
        printf(" %d \n", result);
         printf("res : %02X \n", result);
    }
  return 0;
} 

我的目的是将aaregister设置为二进制值1011,然后根据位位置设置result

如果位 pos = 3 1 那么结果 = 1

如果 pos = 2 0 那么结果 = 0

如果 pos = 1 1 那么结果 = 1

如果 pos = 0 1 那么结果 = 1

但是程序没有返回那个!!

c 程序有什么问题?

最佳答案

您移动了错误的部分:而不是移动 1向右(当 pos 不为零时将产生零)你应该移动 aaregister向右,像这样:

result = result & ((aaregister >> pos) & 1);

另外,声明result需要在循环内移动,以便将其重置回 1在每次迭代中 ( demo)。

现在您的程序可以运行了,下面是关于位操作的一些要点:

您不能通过 OR 运算将零强加到数字中 - 因此,aaregister | 0 << 1操作毫无意义。为了强制为零,您需要使用倒数 AND,如下所示:

aaregister = aaregister & ~(1 << 1);

或更好

aaregister &= ~(1 << 1);

复合赋值使您的代码更易于阅读 - 而不是编写

aaregister = aaregister | 1 << 3;

aaregister |= (1 << 3);

可以在任何位置进行测试 - 如果您想检查那个位置 pos设置与否,使用

if (aaregister & (1 << pos)) {
    ...
}

关于c - 按位运算设置十进制变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35459177/

相关文章:

c - 它会比这更快吗?

javascript - `Math.trunc` vs `|0` vs `<<0` vs `>>0` vs `&-1` vs `^0`

c - 寻找奇偶校验的程序

c - 如何在 64 位寄存器字段中设置第 45 位?

floating-point - 将双倍增加到下一个最接近的值?

c - 使用无符号值对数组进行操作

c++ - "multiple definition of value"在 g++ 而非 gcc 中编译具有未初始化全局的 C 程序时

c++ - 如何制作面具

c - 主.c : warning: passing argument of ‘’ from incompatible pointer type

javascript - 将 JavaScript 转换为 C++