Java位運算子

2021-08-20 13:30:43 字數 2294 閱讀 5860

今天在學習 hashmap 的時候,發現這麼一段**:

static

final

int tablesizefor(int cap)

方法的作用就是,輸入乙個數,如果該數為2的冪次方,那麼將原數返回回去,如果不是,那麼會返回另乙個數,也會是2的冪次方。看完我就覺得我該好好看看位運算子了。

位運算子主要針對二進位制進行運算,它包括了:「與」、「非」、「或」、「異或」、「左移」、「右移」和「無符號右移」,下面詳細介紹每個位運算子。

使用的例子為:a = 60,b = 13;它們的二進位制格式表示將如下:

a = 0011 1100

b = 0000 1101

-----------------

a&b = 0000 1100

a | b = 0011 1101

a ^ b = 0011 0001

~a= 1100 0011

「與」運算對應的符號是 「&」,如果相對應位都是1,則結果為1,否則為0

「或」運算對應的符號是 「|」,如果相對應位都是0,則結果為0,否則為1

「非」運算對應的符號是 「~」,按位取反運算子翻轉運算元的每一位,即0變成1,1變成0

「異或」運算對應的符號是 「^」,如果相對應位值相同,則結果為0,否則為1

「左移」運算對應的符號是:」<<」,左運算元按位左移右運算元指定的位數。比如a << 2得到240,即 1111 0000,實際上在不超出資料範圍的情況下,這種操作相當於左運算元乘以2的右運算元次冪,對於負數也依然成立。

「右移」運算對應的符號是:」>>」,左運算元按位右移右運算元指定的位數,比如a >> 2得到15即 1111,實際上在不超出資料範圍的情況下,這種操作相當於左運算元除以2的右運算元次冪。

如果左運算元是正數,運算相當於對2的右運算元次冪進行取模運算,如:7>>2=1;9>>10=0

如果左運算元是負數,情況不太意義,如:-7>>2=-2

「無符號右移」運算對應的符號是:」>>>」,按位右移補零操作符。左運算元的值按右運算元指定的位數右移,移動得到的空位以零填充,是針對無符號數的。

回到我們最開始的那個演算法上來。

static

final

int tablesizefor(int cap)

如果輸入 cap=8,則n初始化為7,7的二進位制表示為 0111 (為了方便,省去很多不必要的0)後面的5個步驟為

0111

| 0011 = 0111 (移1位得到有運算元)

0111

| 0001 = 0111 (移2位得到有運算元)

0111

| 0000 = 0111 (移4位得到有運算元)

0111

| 0000 = 0111 (移8位得到有運算元)

0111

| 0000 = 0111 (移16位得到有運算元)

所以我們可以看出,當輸入2的冪次方的數時,我們對其減一,得到的結果的二進位制表示為最高位位為0,後面全為1,將這個二進位制數再與自己無符號右移得到的結果進行或運算,都是還是等於自己的,再將結果加一,還是變回原樣。

如果輸入 cap=65,則n初始化為64,64的二進位制表示為 1000000,後面的5個步驟為

1000000

| 0100000 = 1100000(移1位得到有運算元)

1100000

| 0011000 = 1111000(移2位得到有運算元)

1111000

| 0000111 = 1111111(移4位得到有運算元)

1111111

| 0000000 = 1111111(移8位得到有運算元)

1111111

| 0000000 = 1111111(移16位得到有運算元)

可以看出最後得到的二進位制數都是全1的,因為 int 型別是32位的,所以這種操作,最後都能全1的二進位制數,至於是多少位,依據輸入數最高位所在的位判斷,而這種二進位制數加一之後得到的值肯定是2的冪次方,不得不說這種演算法簡潔而又高效,學習了!

還有一種演算法來判斷乙個數是否為2的冪次方

public

static

boolean

ispowerof2(int n)

這個道理差不多,也是進行位運算,演算法很高效。如果輸入的是65,則其二進位制表示為 1000001,而-65則是 11111111111111111111111110111111 (負數的補碼),再按位與,得到結果為1,和原來的不一樣,所以不是2的整數次方數。

java位運算子

按位與運算子 參加運算的兩個資料,按二進位制位進行 與 運算。運算規則 0 0 0 0 1 0 1 0 0 1 1 1 即 兩位同時為 1 結果才為 1 否則為0 例如 3 5 即0000 0011 0000 0101 0000 0001 因此,3 5的值得1。另,負數按補碼形式參加按位與運算。與運...

java 位運算子

移位運算子就是在二進位制的基礎上對數字進行平移。按照平移的方向和填充數字的規則分為三種 左移 帶符號右移 和 無符號右移 在移位運算時,byte short和char型別移位後的結果會變成int型別,對於byte short char和int進行移位時,規定實際移動的次數是移動次數和32的餘數,也就...

Java運算子 算術 邏輯 位運算子

二元操作符型別提公升問題 一元操作符int a 3 int b a 先賦值,後自增 int c a 先自增,再賦值布林邏輯表達符 邏輯與 邏輯或 邏輯非 邏輯與和邏輯或採用短路的方式,從左向右執行,如果確定值,則不再計算下去。boolean 1 2 2 3 0 沒有拋異常,沒有執行3 0位運算子 取...