程序中的所有數在計算機內存中都是以二進制的形式儲存的,位運算就是直接對整數在內存中的二進制位進行操作。
知識點:
1、原碼、反碼、補碼(以byte的1、-1舉例)
示例 1 -1
原碼 0000 0001 1000 0001 ------>第一位是符號位,0是正數,1為負數
反碼 0000 0001 1111 1110 ------>正數反碼是其自身,負數則符號位不變,其他位置全部取反
補碼 0000 0001 1111 1111 ------->正數補碼是其自身,負數則為反碼+1
當然也可以從1通過取反,然后+1的方式得到-1的補碼
2、補碼:用於將十進制的負整數轉換為二進制數。十進制的正整數可以除以2取余,負整數則需要補碼。
補碼的流程:例如-10
10:0000 0000 0000 1010
取反:1111 1111 1111 0101
+1
-10:1111 1111 1111 0110
3、整數在內存中以補碼存在。
一、按位與(&)
定義:如果兩個相應的二進制位都為1,則該位的結果值為1,否則為0.
示例:
1、10與-10 &運算
10:0000 0000 0000 1010 -----> 十進制轉二進制
-10:1111 1111 1111 0110 -----> -10就是10取反,然后+1(補碼)
結果: 0000 0000 0000 0010 -----> 結果為2
二、按位或(|)
定義:如果兩個相應的二進制位有一個為1,則該結果為1,否則為0.
示例:
1、10與-10 |運算
10:0000 0000 0000 1010
-10:1111 1111 1111 0110
結果: 1111 1111 1111 1110 ----->結果-2
第一位為符號位,1代表是負數,因此是補碼形式存在,補碼-->十進制。先-1再取反(符號位不變),。
1000 0000 0000 0001
+1
1000 0000 0000 0010 ------> -2
三、按位異或(^)
定義:如果兩個相應的二進制位值不同則為1,否則為0
示例:
1、10與-10 ^運算
10:0000 0000 0000 1010
-10:1111 1111 1111 0110
結果: 1111 1111 1111 1100 ------> 結果-4
四、取反(~)
定義:用來對一個二進制按位取反。
示例:
1、10取反
10:0000 0000 0000 1010
結果: 1111 1111 1111 0101 ------> 結果-11
五、左移(<<)
定義:將一個數的各二進制位全部左移N位,右補0
示例:
1、10左移<<2
10:0000 0000 0000 1010
結果: 0000 0000 0010 1000------> 結果40
六、右移(>>)
定義:將一個數的各二進制位全部右移N位,移到右邊的低位被舍棄,對於無符號數高位補0,負數高位補1.
1、10右移>>2
10:0000 0000 0000 1010
結果: 0000 0000 0000 0010------> 結果2
2、-10右移>>2
-10:1111 1111 1111 0110
結果: 1111 1111 1111 1101
-1
1111 1111 1111 1100
取反,符號位不變
1000 0000 0000 0011
結果:-3
七、>>>(無符號右移)
定義:將一個數的各二進制位全部右移N位,移到右邊的低位被舍棄,對於無符號數高位補0,只是對32位和64位的值有意義。
示例:
1、-10>>>2
-10:1111 1111 1111 1111 1111 1111 1111 0110 ------->由於>>>只對32和64位有意義,所以把-10定義成32位的
結果: 0011 1111 1111 1111 1111 1111 1111 1101
-1
0011 1111 1111 1111 1111 1111 1111 1100
取反碼(符號位不變,正數反碼是其本身)
0011 1111 1111 1111 1111 1111 1111 1100