- 原碼、反碼和補碼
一個數能夠分紅符號位(0正1負)+ 真值,原碼是咱們正常想法寫出來的二進制。因爲計算機只能作加法,負數用單純的二進制原碼書寫會出錯,因而你們發明了反碼(正數不變,負數符號位不變,真值部分取反);再後來因爲+0, -0的爭端,因而改進反碼,變成補碼(正數不變,負數符號位不變,真值部分取反,而後+1)。二進制前面的0均可以省略,因此總結來講:計算機裏的負數都是用補碼(符號位1,真值部分取反+1)表示的。
- 位運算和無符號位運算
對於負數而言,普通位運算已然保持了符號位1,而是將真值部分進行位運算。但要注意對於負數的位運算操做是創建在補碼上的(補碼運算,獲得補碼結果,將補碼結果轉換爲普通的10進制數結果),因此就會出現-15 >> 1 獲得的是-8 而不是 -7.而無符號位運算則是將負數的補碼整個一塊兒位移,而且高位補0,這就意味着將高位符號位補0變成了正數,因此最後每每獲得一個很大的值,即Integer.MAX_VALUE - x.x爲該負數的絕對值進行位運算後獲得的結果。
- 大數(long 64,int 32)向小數(short 16,byte 8)的溢出問題
直接進行位運算,默認輸出值的類型爲int.short, byte等小數將會自動擴充成int進行位運算,long則使用64位位運算。若是強制大數向小數轉換,就會出現溢出,原大數真值中的1變成了小數裏表明符號位的1而成爲了負數。
最後就是位運算在刷題裏遇到的很少,有時候那種純數字的問題不能用乘法除法的話就能夠考慮位運算了。二進制