這個**太簡單了:
#include
int main()
也就是0111與上1001即1111,也就是15
所以輸出:15
那麼問題來了,如果a或b要是有負數怎麼辦呢?
雖然這種情況很特殊,但是為了避免受虐,還是明明白白、了然於胸的更好。
先用程式看看:
#include
int main()
輸出結果為-7
我們改變一下b的值:
#include
int main()
輸出還是-5
那麼如果都是負數呢?
#include
int main()
輸出:-1
怎麼樣,蒙了沒有呢~
首先需要明確負數如何用二進位制表示
7的二進位制是 0111
-7的二進位制是多少呢?
在計算機中,負數以其正值的補碼形式表達。
原碼:乙個整數,按照絕對值大小轉換成的二進位制數,稱為原碼。
比如 00000000 00000000 00000000 00000111 是 7的 原碼。
反碼:將二進位制數按位取反,所得的新二進位制數稱為原二進位制數的反碼。
取反操作指:原為1,得0;原為0,得1。(1變0; 0變1)
比如:將00000000 00000000 00000000 00000111每一位取反,得11111111 11111111 11111111 11111000。
補碼:反碼加1稱為補碼。
補碼為:
11111111 11111111 11111111 11111000 + 1 = 11111111 11111111 11111111 11111001
所以,-7 在計算機中表達為:11111111 11111111 11111111 11111001
而9的表示為: 00000000 00000000 00000000 00001001
所以 -7 | 9 = 11111111 11111111 11111111 11111001 = -7
如果此時b=2, 則b為: 00000000 00000000 00000000 00000010
那麼-7 | 2 = 11111111 11111111 11111111 11111011
看看原始碼為多少,減一取反,~(11111111 11111111 11111111 11111011 - 1) = 0…… 00000101 = 5
所以 7 | 2 = -5
為什麼是-5?
因為最高位是符號位,如果為0,正數,為1,負數
C 中的位操作
位操作符是對資料按二進位制位進行運算的操作符。c 位操作符包括 按位與 按位或 按位取反 左移 右移 舉例說明 using system class mikecat a 6的二進位制是00000110,3的二進位制是00000011,按位與後等於00000010,即2。int b 6 3 conso...
C 中的位操作
位操作符是對資料按二進位制位進行運算的操作符。c 位操作符包括 舉例說明 using system class mikecat a 6的二進位制是00000110,3的二進位制是00000011,按位與後等於00000010,即2。int b 6 3 console.writeline b b 6的...
C 中的位操作
位操作符是對資料按二進位制位進行運算的操作符。c 位操作符包括 舉例說明 using system class mikecat a 6的二進位制是00000110,3的二進位制是00000011,按位與後等於00000010,即2。int b 6 3 console.writeline b b 6的...