2010-02-02 68 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