程序中的全部數在計算機內存中都是以二進制的形式儲存的。位運算說穿了,就是直接對整數在內存中的二進制位進行操做。java
首先呢,瞭解位運算以前,咱們要先指定進制之間的轉換程序員
衆所周知咱們生活中所用的使用的數字是十進制數,而計算機所認識的是二進制算法
因此呢,做爲一個程序員咱們必需要掌握二進制與十進制之間的互轉與運算數組
1)高位spa
一串二進制串,左面爲高位內存
2)低位字符串
一串二進制串,右面爲低位table
3)原碼擴展
咱們所認識的二進制碼,也就是咱們進制間轉換所獲得的值,咱們認識,但計算機不認識二進制
4)反碼
正數不須要作反碼操做,,,負數的反碼:符號位不變,0變1,1變0 -------反碼是原碼轉爲補碼的中間過程
5)補碼
計算機所認識並可計算的字節碼,正數的補碼仍是其原碼自己,,負數的補碼是其反碼+1
01.正數的原碼,反碼,補碼都一致
02.java中全部的數字都是有符號的 符號位 正數0 負數1
03.負數的反碼=符號位不變+其餘位取反(1變0 0變1)
04.負數的補碼=反碼+1
能夠明確的說,只要你會加法你就能夠秒轉
先來一張比較牛逼的表:
1024 512 256 128 64 32 16 8 4 2 1
看不懂?不要緊,接下來咱們來講
咱們隨便拿來一個數:765 (爲了說明我這個辦法確實nb,咱們拿了一個比較大一點的數)
咱們已經有表了,那麼,就套表唄
首先找到765最近的一個比他小的數
在他下面寫個1,也就是512
而後依次日後相加,發現相加比765大那麼下面寫0,而後捨去,只而後加下一個(注意是下面寫過1的連續相加)最後能夠得出來:
1024 |
512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 |
765的二進制數就是0 1011111101 (最前的0當符號位)
由於是正數因此這既是它的原碼也是它的補碼
那若是是負數呢?-765
簡單,就是拿到其正數的二進制數,改變符號位拿到原碼:
1 1011111101 這個值是咱們轉換的二進制碼
而後取反碼(0變1,1變0,)
也就是 1(符號位不變) 0100000010 而後補碼+1
1 0100000011
-765的補碼就是1 0100000011 這個值是計算機能夠進行計算解析的二進制碼
能夠明確的說在這裏你只要會乘法運算,和明白數組下標就會秒轉 或者拿出上面的萬能轉換表
仍是老規矩,隨便寫一個0和1組成的字符串,而後正負兩種狀況
隨便一個0符號位的二進制串 (既是原碼也是補碼)
0 1101 ok,發大招,轉換
先忽略符號位,將後面的二進制串咱們當作一個倒着的int類型數組,低位爲0,依次往作+1
古老算法:
當前數*2的下標次方,而後將全部的數相加
那麼這個數就是:
1*2的0次方+1*2的2次方+1*2的3次方=1+4+8= 13
而後加上符號位
那麼最終值就是+13
萬能表算法:
1024 |
512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
1 | 1 | 0 | 1 |
那麼。。。就是 8 +4 +1=13
完美!!!
若是拿到的是一個原碼,,那就跟上面算法同樣,只不過符號位爲負的而已
若是拿到一個補碼,也就是中間多兩部操做
上面說了,原碼轉補碼是 原碼取反+1
那麼,反推,補碼轉原碼就是。。。補碼-1取反
獲得原碼,再用上面其中一種算法就ok了
符號位不變,低位溢出刪除,高位補零!
舉個例子:5>>2 (解析:把五的二進制數右移兩位)
先算出5 的二進制:
0 101 右移兩位,符號位不變
0 00101 低位溢出刪除,高位補零!
最後結果:0 001
轉回十進制就是1
若是是負數就是先轉碼而後位移
符號位不變,高位溢出刪除,低位補零!
舉個例子:5<<2 (解析:把五的二進制數右移兩位)
先算出5 的二進制:
0 101 左移兩位,符號位不變
0 10100 高位溢出刪除,低位補零!
最後結果:0 10100
轉回十進制就是20
若是是負數就是先轉碼而後位移
又叫無符號右移
無論符號位!低位溢出刪除,高位補零!
因此呢,,邏輯右移的其值永遠是正數,剩下的跟算術右移大同小異
無符號右移的規則只記住一點:忽略了符號位擴展,0補最高位 無符號右移運算符>>> 只是對32位和64位的值有意義
兩位都爲1,結果爲1
取 5&3
5 二進制:101
3 二進制:011
101
& 011
001
結果爲1
兩位有一位爲1,結果爲1
取5|3
5 二進制:101
3 二進制:011
101
| 011
111
結果爲:7
必須是一位是0,一位是1,結果才爲1
取5^3
5 二進制:101
3 二進制:011
101
^ 011
110
結果是:6
取~3
3 二進制:0 011
總體取反 1 100
負數。。。補碼轉原碼,原碼轉十進制
-1取反:011 100
符號位爲1,因此最後值:-4
最後發現,
有個規律:就是數值+1以後取相反的值