操纵字符变量的位

时间:2011-03-31 04:44:26

标签: c bit-manipulation bitwise-operators

我的目标是通过为每个位赋值来构造一个char变量,即我需要为每个位分配0和1。

我做了以下代码:

char packet;
int bit;
packet &= ~(1 << 0);

packet |= (1 << 1);

printf("\n Checking each bit of packet: \n");

for(int x=0;x<2;x++)
{
    bit = packet & (1 << x);
    printf("\nBit [%d] of packet : %d", x, bit);
}

但我得到的输出是:

Bit[0] of packet : 0
Bit[1] of packet : 2

这里有什么问题?

3 个答案:

答案 0 :(得分:3)

此处没有问题,输出正确。

原因如下:

当您使用|=设置数据包的值时,值为10,其中十进制为2.当您将packet & (1 << x)指定给bit时,您'实际上分配值2(二进制为10)。

Wikipedia entry:

  

确定第二位是否为   1,按位AND应用于它   另一个包含1的位模式   第二位:

    0011 (decimal 3) 
AND 0010 (decimal 2)   
  = 0010 (decimal 2)

如果您的目的是简单地检查该位是否已设置的布尔值,只需将其转换为bool值。

(希望一切都有意义,我有点累了at);)

答案 1 :(得分:1)

第一件事:

char packet;
packet &= ~(1 << 0);

这是不可靠的,因为packet从最后的内存(即垃圾)开始。 1 << 0只是1~1是...... 111110。用packet来定义每次都会给出不同的答案,具体取决于最后的记忆;唯一确定的是最后一位(即最低位)将被设置为0

packet |= (1 << 1);

这只是将第二位设置为1。现在packetxxxxxx10

然后你的循环超过前两位;每个位都被packet & (1 << x)屏蔽,但屏蔽它,它不会移动它。因此,在第一次迭代期间,1 << x1,您得到第一位(0)。第二次迭代1 << x10,或十进制为2。使用xxxxxx10安置10可获得10,您可以立即打印出来(显示格式为2)。

如果要移动该位(为了将其隔离为0或1),您可以使用:

bit = (packet & (1 << x)) >> x;

或等效但更易读的

bit = (packet >> x) & 1;

这将产生(我假设需要)01而不是02的输出。

答案 2 :(得分:0)

该输出完全出乎意料。未设置位0,设置位1。也许你在追求

bit = !!(packet & (1 << x));

...如果您想获得01结果。

顺便说一句,你应该初始化packet - 使用未初始化的变量会导致未定义的行为。