?【圖】用圖片告訴你Java中的位運算

灰灰H_K發表於2019-12-30

前言

​ 雖然位運算在實際開發中並不常用,但是在各種演算法中卻常常見到它們的身影.因為是直接操作二進位制的,所以機器執行起來就快很多,所以儘管實際業務中不常用,但如果你不想只做個碼農,這個基礎還是要掌握的;

講位操作之前,就必須要知道原碼、反碼、補碼

其中正數的原碼=反碼=補碼

原碼、反碼、補碼

在機器的記憶體中,一個負數的表示是這個負數的絕對值取原碼,再取反碼,再加一,最後出現的就是這個負數在記憶體中的表示的二進位制數值

比如說-9在記憶體中的二進位制碼,這裡用8位表示:

最後-9在記憶體中的二進位制值為11110111

在二進位制中,最高位為符號位,0代表正,1代表負**

位運算

左移和右移

Java中的int型別有4位元組,一個位元組有8位,所以這邊用32位表示一個數

負數的左移和右移

這邊負數表示是在記憶體中表示的二進位制值

右移時:最高位補符號位1

左移時:末尾補0

正數的左移和右移

右移時:最高位補符號位0

左移時:末尾補0

無符號右移

無論是正數還是負數,右移最高位一律補0

&(位與)

當相對應的位都為1時,等於1,否則等於0

為了方便表示,接下來全部都用8位表示一個數

|(位或)

當相對應的位有一個為1時,等於1,否則等於0

^(異或)

當相對應的位不同時,等於1,相同時等於0

~(取反)

1等於0,0等於1

總結

含義 運算子 說明
左移 << 末尾補0
右移 >> 負數:最高位補符號位1 正數:最高位補符號位0
無符號右移 >>> 無論是正數還是負數,右移最高位一律補0
&(位與) & 當相對應的位都為1時,等於1,否則等於0
|(位或) | 當相對應的位有一個為1時,等於1,否則等於0
^(異或) ^ 當相對應的位 不同時,等於1 相同時,等於0
~(取反) ~ 1等於0,0等於1

相關文章