java按位運算子(&、|、~、^) 移位操作符(>> >> )
位運算子來源於C語言面向底層的操作,在這種操作中經常需要直接操作硬體,設定硬體暫存器內的二進位制位。Java的設計初衷是為了嵌入電視機機頂盒,所以種面向底層的操作仍被保留了下來。
1、“與”、“位與”(&)
按位“與”操作符,如果兩個數的二進位制,相同位數都是1,則該位結果是1,否則是0.
例1 5&4
5的二進位制是 0000 0000 0000 0101
4的二進位制是 0000 0000 0000 0100
則結果是 0000 0000 0000 0100 轉為十進位制是4。
2、“或”、“位或”(|)
按位“或”操作符,如果兩個數的二進位制,相同位數有一個是1,則該位結果是1,否則是0
例2 5 | 4
5的二進位制是 0000 0000 0000 0101
4的二進位制是 0000 0000 0000 0100
則結果是 0000 0000 0000 0101 轉為十進位制是5。
3、“異或、“位異或”(^)
按位“異或”操作符,如果兩個數的二進位制,相同位數只有一個是1,則該位結果是1,否則是0
例3 5 ^ 4
5的二進位制是 0000 0000 0000 0101
4的二進位制是 0000 0000 0000 0100
則結果是 0000 0000 0000 0001 轉為十進位制是1
4、“非”、“位非”(~)也稱為取反操作符
按位“非”操作符,屬於一元操作符,只對一個運算元進行操作,(其他按位操作符是二元操作符)。按位“非”生成與輸入位相反的值,——若輸入0,則輸出1,若輸入1,則輸出0。
例4 ~5
5的二進位制是 0000 0000 0000 0101
則~5是 1111 1111 1111 1010 轉為十進位制是 -6。
這裡出現負數,強行插入一波^_^。
電腦的的世界中只有0和1,那麼負數怎麼表示呢?
二進位制的正負是從高位看,最高位如果1則是負數,如果是0則是正數。
如果負數單純是把最高位變為1的話,在運算中會出現不是我們想要的值,所以引入了:原碼,反碼,補碼。正數的原碼,反碼,補碼都一樣,負數的反碼是對除了符號位(最高位)對原碼取反,補碼是對反碼+1
負數的二進位制轉化,計算機計算是用的補碼
1、首先取出這個數的原碼的二進位制,
2、然後再求出反碼
3、最後求出補碼
例5 -5
-5的原碼是 1000 0000 0000 0101
求出反碼的是 1111 1111 1111 1010
求出補碼是 1111 1111 1111 1011
Java移位操作符
移位操作符操作的運算物件也是二進位制的“位”。移位操作符只可用來處理整數型別,左移位操作符(<<)能按照操作符右側指定的位數將操作符左邊的運算元向左移動(在低位補0),“有符號”右移位操作符(>>)則按照操作符右側指定的位數將操作符左邊的運算元向右移。“有符號”右移位操作符使用“符號擴充套件”;若符號位正,則在高位插入0;若符號位負。則在高位插入1。java中增加了一種“無符號”右移位操作符(>>>),他使用“零擴充套件”;無論正負,都在高位插入0。這一操作符是C或C++中所沒有的。
例6 5<<2 等於20
5的二進位制是 0000 0000 0000 0101
左移兩位 0000 0000 0001 0100
例7 5>>2 等於 1
5的二進位制是 0000 0000 0000 0101
右移兩位 0000 0000 0000 0001
例8 -5>>2 等於 -2
-5的二進位制是 1111 1111 1111 1011
右移兩位 1111 1111 1111 1110 轉十進位制,例5反著來,先-1,然後取反
Java運算子優先順序
優先順序 | 運算子分類 | 結合順序 | 運算子 |
由 高 到 低 |
分隔符 | 左結合 | . [] ( ) ; , |
一元運算子 | 右結合 | ! ++ -- - ~ | |
算術運算子 移位運算子 |
左結合 | * / % + - << >> >>> | |
關係運算符 | 左結合 | < > <= >= instanceof(Java 特有) = = != | |
邏輯運算子 | 左結合 | ! && || ~ & | ^ | |
三目運算子 | 右結合 | 布林表示式?表示式1:表示式2 | |
賦值運算子 | 右結合 | = *= /= %= += -= <<= >>= >>>= &= *= |= |
移位運算子
移位運算子操作的物件就是二進位制的位,可以單獨用移位運算子來處理int型整數。
運算子 | 含義 | 例子 |
<< | 左移運算子,將運算子左邊的物件向左移動運算子右邊指定的位數(在低位補0) | x<<3 |
>> | "有符號"右移運算 符,將運算子左邊的物件向右移動運算子右邊指定的位數。使用符號擴充套件機制,也就是說,如果值為正,則在高位補0,如果值為負,則在高位補1. | x>>3 |
>>> | "無符號"右移運算 符,將運算子左邊的物件向右移動運算子右邊指定的位數。採用0擴充套件機制,也就是說,無論值的正負,都在高位補0. | x>>>3 |
原文:https://blog.csdn.net/mxiaoyem/article/details/78569782