原碼,反碼和補碼
1:二進制的最高位是符號位(0表示正數,1表示負數)
2:正數的原碼,反碼補碼都一樣
3:負數的反碼等於它的原碼符號位不變,其他位取反(0變1,1變0)
4:負數的補碼等於它的反碼加1
5:0的反碼補碼都是0
6:在計算機運算的時候都是以補碼的方式進行運算的
例子 | 名稱 | 結果 |
$a & $b | and(按位與) | 將把$a和$b中都爲1的位設爲1 |
$a | $b | or(按位或) | 將把$a或者$b中爲1的位設爲1 |
$a ^ $b | xor(按位異或) | 將把$a和$b中不同的位設爲1 |
~$a | not(按位取反) | 將$a中爲0的位設爲1,反之亦然 |
$a << $b | shift left(左移) | 將$a中的位向左移動,$b次(每一次移動都表示”乘以2“) |
$a >> $b | shift right(右移) | 將$a中的位向右移動,$b次(每一次移動都表示”除以2“) |
and(按位與) :
5 & -2 = 4
5的原碼爲:00000000 00000000 00000000 00000101 正數的原碼,原碼反碼補碼都一樣
5的反碼爲:00000000 00000000 00000000 00000101
5的補碼爲:00000000 00000000 00000000 00000101
-2的原碼爲:10000000 00000000 00000000 00000010
-2的反碼爲:11111111 11111111 11111111 11111101 負數的反碼等於它的原碼符號位不變,其他位取反(0變1,1變0)
-2的補碼爲:11111111 11111111 11111111 11111110 負數的補碼等於它的反碼加1
按位與(將把$a和$b中都爲1的位設爲1)
5的補碼爲:00000000 00000000 00000000 00000101
-2的補碼爲:11111111 11111111 11111111 11111110
計算得到的補碼:00000000 00000000 00000000 00000100
計算得到的補碼:00000000 00000000 00000000 00000100 因爲符號位爲0表示正數,而正數的原碼反碼補碼都一樣
計算得到的反碼:00000000 00000000 00000000 00000100
計算得到的原碼:00000000 00000000 00000000 00000100
將計算得到的原碼轉換爲十進制得到4,所以5 & -2 = 4
or(按位或):
5 | -2 = -1
5的原碼爲:00000000 00000000 00000000 00000101 正數的原碼,原碼反碼補碼都一樣
5的反碼爲:00000000 00000000 00000000 00000101
5的補碼爲:00000000 00000000 00000000 00000101
-2的原碼爲:10000000 00000000 00000000 00000010
-2的反碼爲:11111111 11111111 11111111 11111101 負數的反碼等於它的原碼符號位不變,其他位取反(0變1,1變0)
-2的補碼爲:11111111 11111111 11111111 11111110 負數的補碼等於它的反碼加1
按位或(將把$a或者$b中爲1的位設爲1)
5的補碼爲:00000000 00000000 00000000 00000101
-2的補碼爲:11111111 11111111 11111111 11111110
計算得到的補碼:11111111 11111111 11111111 11111111
計算得到的補碼:11111111 11111111 11111111 11111111 因爲符號位爲1表示負數
計算得到的反碼:11111111 11111111 11111111 11111110 負數的補碼等於它的反碼加1,所以反碼則等於它的補碼減1
計算得到的原碼:10000000 00000000 00000000 00000001 負數的原碼等於它的反碼符號位不變,其他位取反(0變1,1變0)
將計算得到的原碼轉換爲十進制得到1,然後最高位爲符號位,符號位爲1表示負數,所以得到-1,所以5 | -2 = -1
xor(按位異或):
5 ^ -2 = -5
5的原碼爲:00000000 00000000 00000000 00000101 正數的原碼,原碼反碼補碼都一樣
5的反碼爲:00000000 00000000 00000000 00000101
5的補碼爲:00000000 00000000 00000000 00000101
-2的原碼爲:10000000 00000000 00000000 00000010
-2的反碼爲:11111111 11111111 11111111 11111101 負數的反碼等於它的原碼符號位不變,其他位取反(0變1,1變0)
-2的補碼爲:11111111 11111111 11111111 11111110 負數的補碼等於它的反碼加1
按位異或(將把$a和$b中不同的位設爲1)
5的補碼爲:00000000 00000000 00000000 00000101
-2的補碼爲:11111111 11111111 11111111 11111110
計算得到的補碼:11111111 11111111 11111111 11111011
計算得到的補碼:11111111 11111111 11111111 11111011 因爲符號位爲1表示負數
計算得到的反碼:11111111 11111111 11111111 11111010 負數的補碼等於它的反碼加1,所以反碼則等於它的補碼減1
計算得到的原碼:10000000 00000000 00000000 00000101 負數的原碼等於它的反碼符號位不變,其他位取反(0變1,1變0)
將計算得到的原碼轉換爲十進制得到5,然後最高位爲符號位,符號位爲1表示負數,所以得到-5,所以5 ^ -2 = -5not(按位取反):
~5 = -6
5的原碼爲:00000000 00000000 00000000 00000101 正數的原碼,原碼反碼補碼都一樣
5的反碼爲:00000000 00000000 00000000 00000101
5的補碼爲:00000000 00000000 00000000 00000101
按位取反(將$a中爲0的位設爲1,反之亦然)
5的補碼爲:00000000 00000000 00000000 00000101
計算得到的補碼:11111111 11111111 11111111 11111010
計算得到的補碼:11111111 11111111 11111111 11111010 因爲符號位爲1表示負數
計算得到的反碼:11111111 11111111 11111111 11111001 負數的補碼等於它的反碼加1,所以反碼則等於它的補碼減1
計算得到的原碼:10000000 00000000 00000000 00000110 負數的原碼等於它的反碼符號位不變,其他位取反(0變1,1變0)
將計算得到的原碼轉換爲十進制得到6,然後最高位爲符號位,符號位爲1表示負數,所以得到-6,所以~5 = -6shift left(左移):
5 << 2 = 20
5的原碼爲:00000000 00000000 00000000 00000101 正數的原碼,原碼反碼補碼都一樣
5的反碼爲:00000000 00000000 00000000 00000101
5的補碼爲:00000000 00000000 00000000 00000101
左移(將$a中的位向左移動,$b次(每一次移動都表示”乘以2“))
5的補碼爲:00000000 00000000 00000000 00000101
計算得到的補碼:00000000 00000000 00000000 00010100 將5的補碼左移兩位,符號位不變,新增的用0表示
計算得到的補碼:00000000 00000000 00000000 00010100 因爲符號位爲0表示正數,正數的原碼,原碼反碼補碼都一樣
計算得到的反碼:00000000 00000000 00000000 00010100
計算得到的原碼:00000000 00000000 00000000 00010100
將計算得到的原碼轉換爲十進制得到20,然後最高位爲符號位,符號位爲0表示正數,所以得到20,所以5 << 2 = 20shift right(右移):
5 >> 2 = 1
5的原碼爲:00000000 00000000 00000000 00000101 正數的原碼,原碼反碼補碼都一樣
5的反碼爲:00000000 00000000 00000000 00000101
5的補碼爲:00000000 00000000 00000000 00000101
右移(將$a中的位向右移動,$b次(每一次移動都表示”除以2“))
5的補碼爲:00000000 00000000 00000000 00000101
計算得到的補碼:00000000 00000000 00000000 00000001 將5的補碼右移兩位,符號位不變,新增的用0表示
計算得到的補碼:00000000 00000000 00000000 00000001 因爲符號位爲0表示正數,正數的原碼,原碼反碼補碼都一樣
計算得到的反碼:00000000 00000000 00000000 00000001
計算得到的原碼:00000000 00000000 00000000 00000001
將計算得到的原碼轉換爲十進制得到1,然後最高位爲符號位,符號位爲0表示正數,所以得到1,所以5 >> 2 = 1