java位运算实例详解——(amp;)、(|)、(~)、(^)、(lt;lt;)、(gt;gt;)
位運算種類
~:按位取反
&:位與
|:位或
^:異或
<<:左移
>>:右移
>>>:邏輯右移
注意這里沒有<<<運算符
準備工作
位運算要求我們要把十進制轉換成二進制來進行相關計算,
而且要知道計算機在算二級制數的時候,會把兩數轉換成補碼來進行計算,結果也是以補碼的形式存在的正數補碼等于原碼,負數補碼等于原碼的反碼+1(這個很重要)
如果不了解原碼反碼補碼請參考我的另一篇博客原碼,反碼補碼詳解
各運算符詳解
(1)~:按位取反
舉個例子~7
我們把7寫成二進制就是:00000111
按位取反就是把0變成1,1變成0
即:
00000111
~
——————
11111000
既然是補碼且最高位為1,那么結果必定為負數,那么就要把它變成原碼再轉換成十進制
要求原碼先求反碼(反碼=補碼-1)
即:
11111000
-1
——————
11110111
原碼就為:
11110111
——————
10001000
符號位不變
最后把二進制轉換成二進制就得到了-8
所以~7=-8;
(2)&:位于
舉個例子5&(-7)
首先一樣的把兩者都寫成二進制
5:00000101
-7:10000111
位于就是都為1則結果是1,其他情況都是0
由于-7需要轉換成補碼所以參與運算的實際上是11111001
即:
00000101
&
11111001
——————
00000001
補碼結果是00000001為正數所以原碼等于補碼
故轉換成十進制為:1
所以5&(-7)=1
(3)|:位或
舉個例子6|4
化成二進制:
6:00000110
4:00000100
位或就是二者只要有一個為1結果就是1
即:
00000110
|
00000100
——————
00000110
補碼結果是00000110為正數所以原碼等于補碼
轉換成十進制為6
即6|4=6
(4)^:異或
舉個例子8^(-3)
轉化成二級制
8:00001000
-3:10000011
異或就是相同為0不同為1
-3參與運算的補碼為11111101
即:
00001000
^
11111101
——————
11110101
補碼為11110101
那么原碼就是10001011
轉換成十進制就為-11
即8^&(-3)=11
(6)<<:表示左移,不分正負數,低位補0
注:以下數據類型默認為byte為8位,左移時不管正負,低位補0
正數:r = 20 << 2
20的二進制補碼:0001 0100
向左移動兩位后:0101 0000
結果:r = 80
負數:r = -20 << 2
-20 的二進制原碼 :1001 0100
-20 的二進制反碼 :1110 1011
-20 的二進制補碼 :1110 1100
左移兩位后的補碼:1011 0000
反碼:1010 1111
原碼:1101 0000
結果:r = -80
(7)>>: 表示右移,如果該數為正,則高位補0,若為負數,則高位補1;
注:以下數據類型默認為byte為8位
正數:r = 20 >> 2
20的二進制補碼:0001 0100
向右移動兩位后:0000 0101
結果:r = 5
負數:r = -20 >> 2
-20 的二進制原碼 :1001 0100
-20 的二進制反碼 :1110 1011
-20 的二進制補碼 :1110 1100
右移兩位后的補碼:1111 1011
反碼:1111 1010
原碼:1000 0101
結果:r = -5
(8)>>> 表示無符號右移,也叫邏輯右移,即若該數為正,則高位補0,而若該數為負數,則右移后高位同樣補0
注:以下數據類型默認為int 32位
正數: r = 20 >>> 2
的結果與 r = 20 >> 2 相同;
負數: r = -20 >>> 2
-20原碼:10000000 00000000 00000000 00010100
反碼:11111111 11111111 11111111 11101011
補碼:11111111 11111111 11111111 11101100
右移:00111111 11111111 11111111 11111011
結果:r = 1073741819
>>這里的-20要寫成32位的而不寫成8位,是因為上邊寫成8位和32結果沒差別,博主為了使運算簡潔就寫成了8位但是這里的32位對結果都要影響所以就不能簡寫成8位
總結
以上是生活随笔為你收集整理的java位运算实例详解——(amp;)、(|)、(~)、(^)、(lt;lt;)、(gt;gt;)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JDK,JRE和JVM三者的关系以及ja
- 下一篇: 正儿八经的详细讲java内部类