按位运算以设置十进制变量

时间:2016-02-17 14:17:46

标签: 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程序有什么问题?

3 个答案:

答案 0 :(得分:3)

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

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

此外,result的声明需要在循环内移动,以便在每次迭代(demo)时将其重置为1

现在你的程序正在运行,这里有一些关于位操作的要点:

你不能通过OR-ing 强制零成一个数字 - 因此,aaregister | 0 << 1操作毫无意义。为了强制零,你需要使用反向AND,如下所示:

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

或更好

aaregister &= ~(1 << 1);

复合作业使您的代码更易于阅读 - 而非写作

aaregister = aaregister | 1 << 3;

aaregister |= (1 << 3);

可以在任何位置测试一下 - 如果您想检查位置pos是否已设置,请使用

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

答案 1 :(得分:2)

基于我认为的预期输出的新答案:

#include <stdio.h>

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

输出结果为:

|0: 01
|1: 03
|2: 03
|3: 0B
Pos 3: res : 1
Pos 2: res : 0
Pos 1: res : 1
Pos 0: res : 1

答案 2 :(得分:-1)

设置一下你可以使用这个逻辑

a=(1<<(pos-1))|a;