我的目标是通过为每个位赋值来构造一个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
这里有什么问题?
答案 0 :(得分:3)
此处没有问题,输出正确。
原因如下:
当您使用|=
设置数据包的值时,值为10
,其中十进制为2.当您将packet & (1 << x)
指定给bit
时,您'实际上分配值2(二进制为10
)。
确定第二位是否为 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
。现在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
的输出。
答案 2 :(得分:0)
该输出完全出乎意料。未设置位0,设置位1。也许你在追求
bit = !!(packet & (1 << x));
...如果您想获得0
或1
结果。
顺便说一句,你应该初始化packet
- 使用未初始化的变量会导致未定义的行为。