操作字符变量的位
我的目标是通过为每个位分配值来构造一个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 。 所以现在packet是xxxxxx10 。
你的循环然后通过前两位; 每一位都用packet & (1 << x)掩码,但只掩盖它,它不会移动它。 所以在第一次迭代中, 1 << x是1 ,并且得到第一位( 0 )。 第二次迭代, 1 << x为10或2进制。 xxxxxx10与10给出10 ,您立即打印出来(它显示格式为2 )。
如果您想移动该位(为了将其隔离为0或1),您可以使用:
bit = (packet & (1 << x)) >> x;
或者等效但更具可读性
bit = (packet >> x) & 1;
这将产生(我假设期望的)输出的0 , 1而不是0 , 2 。
该输出看起来完全是预期的 位0未置位,位1置位。 也许你在追求
bit = !!(packet & (1 << x));
...如果你想得到0或1结果。
顺便说一句,你应该初始化packet - 使用未初始化的变量会导致未定义的行为。
上一篇: Manipulating bits of a character variable
下一篇: C question: Padding bits in unsigned integers and bitwise operations (C89)
