操作字符变量的位

我的目标是通过为每个位分配值来构造一个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

这里有什么问题?


这里没有问题,输出是正确的。

原因如下:

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

维基百科条目:

要确定第二位是否为1,将对其应用按位AND,并在第二位包含1的另一位模式:

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

如果你的目的是简单地检查布尔值是否已经设置,只需将其转换为布尔值即可。

(希望一切都有道理,我有点疲倦;))


第一件事:

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进制。 xxxxxx1010给出10 ,您立即打印出来(它显示格式为2 )。

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

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

或者等效但更具可读性

bit = (packet >> x) & 1;

这将产生(我假设期望的)输出的01而不是02


该输出看起来完全是预期的 位0未置位,位1置位。 也许你在追求

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

...如果你想得到01结果。

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

链接地址: http://www.djcxy.com/p/36393.html

上一篇: Manipulating bits of a character variable

下一篇: C question: Padding bits in unsigned integers and bitwise operations (C89)