2010-02-02 67 views
2

有人可以向我解释为什么以下结果为b = 13?c和C++操作符帮助

int a, b, c; 
a = 1|2|4; 
b = 8; 
c = 2; 
b |= a; 
b&= ~c; 
+6

在每一步之后在一张纸上写下'a','b'和'c'的值。把它放在这里,告诉我们你不明白的部分。 – dirkgently 2010-02-02 20:56:00

回答

16

它使用二进制manipultaors。 (假设整数是1个字节,并且使用两个补码进行存储,等)

a = 1|2|4意味着a = 00000001 or 00000010 or 00000100,这是00000111,或7
b = 8装置b = 00001000
c = 2表示c = 00000010
b |= a装置b = b | a这意味着b = 00001000 or 00000111,这是00001111,或15
~c意味着not c,这是11111101.
b &= ~c装置b = b & ~c,这意味着b = 00001111 and 11111101,这是00001101,或13

+0

+1优秀解释 – JonH 2010-02-02 20:57:57

+0

谢谢。这是一个很好的解释 – user69514 2010-02-02 21:22:16

+0

+1简单而简单的解释,但仍然非常有效。 – 2010-02-09 17:37:53

0

允许进入二进制模式: A = 0111(以十进制7) b = 1000(8) C = 0010(2)

然后我们OR b,其中A获得b = 1111(15) c = 0010和〜c = 1101 最后b是否定的c,这给了我们c = 1101(13)

0

Ed发布的链接是一个很好的链接。您是否一次一步分析操作员?你完全理解每一步发生了什么?是否有一个特定的步骤,你坚持?或者你只是在整体数学上感到困惑?

0

提示:十进制转换为二进制,并给它一个镜头..也许...只是也许你会想出这一切了自己

+0

呵呵..很多人打败了我:) – ka05 2010-02-02 20:58:52

1
a = 1|2|4 
    = 0b001 
    | 0b010 
    | 0b100 
    = 0b111 
    = 7 

b = 8 = 0b1000 

c = 2 = 0b10 

b|a = 0b1000 
    | 0b0111 
    = 0b1111 = 15 

~c = 0b111...1101 

(b|a) & ~c = 0b00..001111 
      & 0b11..111101 
      = 0b00..001101 
      = 13 
0

a = 1 | 2 | 4;

分配值7 a 。这是因为你的常数1,2和4执行位操作OR由于每个这些的二进制表示为1时,在10和100分别,将得到111,其为7。

b |= a;

This OR s b and a并将结果分配给b。由于b的二进制表示现在是111和a的二进制表示为1000(8),则最终获得1111或15

b &= ~c;

在此表达的~c装置的c的按位求反。这实质上在0到1之间翻转,反之亦然,在c的二进制表示中。这意味着c从10切换到111 ... 11101。

在否定c之后,在bc之间存在按位AND操作。这意味着只有在bc中都为1的位保持为1,其他都等于0。由于b现在是1111,并且c全是1,除了第二低位之外,b的所有位都保持为1,除了2位之外。

翻转b的2位结果与简单地从其值中减去2相同。由于其当前值为15,15-2 = 13,因此分配结果为b == 13