操作字符变量的位
我的目标是通过为每个位分配值来构造一个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)