2011-03-31 54 views
2

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

这里有什么问题吗?

+1

目前尚不清楚你实际要做什么。你期望发生什么? – yan 2011-03-31 04:49:39

+0

这就是你的代码所做的。设g =垃圾(即未初始化的存储位)。您从“g g g g g g g g”开始。首先按位运算创建“g g g g g g 0”,第二个运算创建“g g g g g g 0 0”。而你的循环只是输出[0] = 0x00(第一位是0)。和[1] = 0x02(第二位是1)。所以基本上,正如我们许多人经常说的那样,“按设计工作” – DXM 2011-03-31 04:59:43

回答

3

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

这里的原因是:当您设置包的价值与|=

,该值是10其中,十进制,是2.当你分配给packet & (1 << x)bit,你实际上将值2( 10二进制)。

Wikipedia entry:

为了确定第二位是否是 1,按位与施加到其上和 在 含有1中的第二位的另一个比特模式:

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

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

(希望所有是有道理的,我有点累了ATM;))

0

该输出显示完全预期。位0未置位,位1置位。也许你以后

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

...如果你想获得一个01结果。

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

+0

或者只是......你知道'bit =小包'x & 1;' – domen 2011-04-02 17:57:37

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

如果要移动的位(以将其分离为0或1),你可以使用:

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

或等值,但更易读

bit = (packet >> x) & 1; 

这将产生0,1而不是0,2的(我假设期望的)输出。