原碼:正數是其二進位制本身;負數是符號位為1,數值部分取x絕對值的二進位制
反碼:正數的反碼是其本身,對於負數其符號位不變其它各位取反(0變1,1變0)。
補碼:正數的補碼是其本身,負數的補碼是其反碼的基礎上+1。
正數的補碼、反碼都是其本身
要弄懂位運算子的計算方法,首先必須明白二進位制數在記憶體中的存放形式,二進位制數在記憶體中是以補碼的形式存放的。
參與運算的兩個值,轉換成2進製,如果兩個相應位均為1時,結果位才為1,否則為0.
例如:8&3,轉換成2進製:00001000(8的二進位制) & 00000011(3的二進位制) 00000000(結果為0)
7 & 3,轉換成2進製:00000111(7的二進位制) & 00000011(3的二進位制) 00000011(結果為3)
-7 & 3,轉換成2進製:1000 0111(-7的二進位制) & 0000 0011(3的二進位制),轉換成補碼形式1111 1001(-7的補碼) & 0000 0011(3的補碼), 結果為0000 0001(結果為1)
-7 & -3,轉換成2進製:1000 0111(-7的二進位制) & 1000 0011(-3的二進位制),轉換成補碼形式1111 1001(-7的補碼) & 1111 1101(-3的補碼), 結果為1111 1001 這是補碼還要轉換成原碼,轉換後為 1000 0111(結果為-7)
參與運算的兩個值,轉換成二進位制,如果兩個數的相應位有1,結果位就為1。
例如:8&3,轉換成2進製:00001000(8的二進位制) | 00000011(3的二進位制) 00001011(結果為11)
7 & 3,轉換成2進製:00000111(7的二進位制) | 00000011(3的二進位制) 00000111(結果為7)
-7 & 3,轉換成2進製:1000 0111(-7的二進位制) | 0000 0011(3的二進位制),轉換成補碼形式1111 1001(-7的補碼) | 0000 0011(3的補碼), 結果為1111 1011這是補碼,轉換成原碼為1000 0101(結果為-5)
-7 & -3,轉換成2進製:1000 0111(-7的二進位制) | 1000 0011(-3的二進位制),轉換成補碼形式1111 1001(-7的補碼) | 1111 1101(-3的補碼), 結果為1111 1101這是補碼,轉換成原碼為1000 0011(結果為-3)
參與運算的兩個值,轉換成二進位制,如果兩個數的相應為相同,為0,否則為1.
例如:8&3,轉換成2進製:00001000(8的二進位制) ^ 00000011(3的二進位制) 00001011(結果為11)
7 & 3,轉換成2進製:00000111(7的二進位制) ^ 00000011(3的二進位制) 00000100(結果為4)
-7 & 3,轉換成2進製:1000 0111(-7的二進位制) ^ 0000 0011(3的二進位制),轉換成補碼形式1111 1001(-7的補碼) ^ 0000 0011(3的補碼), 結果為1111 1010這是補碼,轉換成原碼為1000 0110(結果為-6)
-7 & -3,轉換成2進製:1000 0111(-7的二進位制) ^ 1000 0011(-3的二進位制),轉換成補碼形式1111 1001(-7的補碼) ^ 1111 1101(-3的補碼), 計算結果為0000 0100,十進位制為 4
取反運算子~為單目運算子,具有右結合性。 其功能是對參與運算的數的各二進位按位求反。
例如:~7,轉換成2進製:0000 0111(7的二進位制)[原]
,求補碼0000 0111 [補]
,對補碼取反,包括符號位1111 1000
,最後補碼轉原碼1111 0111 [反碼],1000 1000 [原碼]
計算步驟:
先對正數求補碼
然後對補碼取反,包括符號位
最後進行乙個補碼求原碼的過程
快速計算小技巧:
所有正整數的按位取反是其本身+1的負數
所有負整數的按位取反是其本身+1的絕對值
零的按位取反是 -1(0在數學界既不是正數也不是負數)
左移運算子和右移運算子都是雙目運算子。
左移運算:其功能是將運算子『<<』左邊的運算元的各二進位制位全部左移指定的位數。左移時,運算元移出左邊界的位被遮蔽,從右邊開始用0填補空位,其表示式的一般形式為:(運算元) << (移位位數)
例如:13 << 3, 將運算元轉換成二進位制0000 1101
,左移3位0110 1000
,十進位制就是104。
15<<2, 將運算元轉換成二進位制0000 1111
,左移2位0011 1100
,十進位制就是60。
計算技巧: (運算元) x 2移位位數 ,例如:13 x 23 = 104, 15 x 22 =60。
右移運算:其功能是將運算子『>>』 左邊的運算元的各二進位制位全部右移指定的位數。
右移時,運算元移出右邊的位被遮蔽,從左邊開始用符號位填補空位。如果原先最高位是1,則填補1;如果是0,則填補0,其表示式的一般形式為:(運算元) >> (移位位數)
。
例如:16 >> 3, 將運算元轉換成二進位制0001 0000
,右移3位0000 0010
,十進位制就是2。
15>>2, 將運算元轉換成二進位制0000 1111
,右移2位0000 0011
,十進位制就是3。
-15>>2, 將運算元轉換成二進位制1000 1111
,轉換成補碼1111 0001
,右移2位1111 1100
,轉換成原碼1000 0100
十進位制就是-4。
C語言位運算子
一.c語言位運算子簡介 c語言的位運算子有六種,分別是 右移運算子 左移運算子 按位與運算子 按位或運算子 按位異或運算子 按位取反運算子 這些運算子都是對於基本資料型別的二進位制位進行操作的,這裡我們只討論整型資料型別的位運算 二.各個運算子的具體使用 右移運算子 將整數的二進位制形式整體向右移動...
C語言 位運算子
位運算是指按二進位制進行的運算。在系統軟體中,常常需要處理二進位制位的問題。c語言提供了6個位操作運算子。這些運算子只能用於整型運算元,即只能用於帶符號或無符號的char,short,int與long型別。c語言提供的位運算子列表 1 按位與 運算子 按位與是指 參加運算的兩個資料,按二進位制位進行...
C語言 位運算子
位操作符,主要包括 與,或 符 取反符 移位符 異或符 開始前先看一段實現二進位制輸出的 方便觀察位操作 參考鏈結知乎作者 碼農愛學習 void printf bin int num printf 每8位加個空格,方便檢視 printf r n 與0清0,與1不變 功能1 提取位資料 功能2 清除 ...