Java中位運算符的使用


先預知識:

  數據在計算機中是以二進制的形式進行存儲的,而二進制在內存中是以補碼的形式進行存儲的。在介紹位運算之前,首先來看一下原碼、反碼和補碼的概念。由於正數的原碼、反碼和補碼的形式都是一樣的,所以以下主要針對負數進行講解。
  原碼:在數值前直接加一符號位的表示法。
  反碼:原碼的數值位取反(0變1,1變0)。
  補碼:原碼加1。
  PS:已知補碼,求原碼。
  分析:按照求負數補碼的逆過程,可以采取補碼減1再取反的思路。但是對於二進制來說,減1取反和取反加1的效果是一樣的。所以仍然可以采用取反加1的方法來求得原碼。
Java中的位運算符有:&(按位與)、|(按位或)、^(按位異或)、~(取反)、<<(左移)、>>(右移)、>>>(無符號右移).以int型數據為例介紹,占4個字節,32位:(以下1代表true,0代表false)
&(按位與):當兩邊操作數全為true時返回true,否則返回false
如,6&3=2,看步驟:
6 00000000 00000000 00000000 00000110
3 00000000 00000000 00000000 00000011
& -------------------------------------------------------
2 00000000 00000000 00000000 00000010
-6&3=2,看步驟:
-6 11111111 11111111 11111111 11111010(補碼,原碼取反再加1)
3  00000000 00000000 00000000 00000011
& ---------------------------------------------------------
2  00000000 00000000 00000000 00000010
|(按位或):兩邊操作數只要有一邊為true,結果就為true,只有當兩邊操作數全為false時才返回false
如,6|3=7,看步驟:
6 00000000 00000000 00000000 00000110
3 00000000 00000000 00000000 00000011
| ---------------------------------------------------------
7 00000000 00000000 00000000 00000111
-6|3=-5,看步驟:
-6 11111111 11111111 11111111 11111010(補碼,原碼取反再加1)
3  00000000 00000000 00000000 00000011
| ----------------------------------------------------------
-5 10000000 00000000 00000000 00000101(原碼,補碼取反再加1)
^(按位異或):兩邊操作數相同就為false,不同則為true
如,6^3=5,看步驟:
6 00000000 00000000 00000000 00000110
3 00000000 00000000 00000000 00000011
^ ---------------------------------------------------------
5 00000000 00000000 00000000 00000101
-6^3=-7,看步驟:
-6 11111111 11111111 11111111 11111010(補碼,原碼取反再加1)
3  00000000 00000000 00000000 00000011
^ ---------------------------------------------------------
-7 10000000 00000000 00000000 00000111(原碼,補碼取反再加1)
~(取反):二進制每一位取反,1變0,0變1
如:~6=-7,看步驟:
6  00000000 00000000 00000000 00000110
~ --------------------------------------------------------
-7 10000000 00000000 00000000 00000111(原碼,補碼取反再加1)
~(-6)=5,看步驟:
-6 11111111 11111111 11111111 11111010(補碼,原碼取反再加1)
~ --------------------------------------------------------
5  00000000 00000000 00000000 00000101
<<(左移):所有位向左移動一位,相當於乘以2,低位用0補齊
如:6<<1=12,看步驟:
6     00000000 00000000 00000000 00000110
<< -----------------------------------------------------------
12 000000000 00000000 00000000 00001100
如:-6<<1=-12,看步驟:
-6     11111111 11111111 11111111 11111010(補碼,原碼取反再加1)
<< ----------------------------------------------------------
-12 100000000 00000000 00000000 00001100(原碼,補碼取反再加1)
>>(右移):所有位向右移動一位,相當於除以2,高位按符號位補齊
如:6>>1=3,看步驟:
6   00000000 00000000 00000000 00000110
>> ---------------------------------------------------------
3   00000000 00000000 00000000 000000110
-6>>1=-3,看步驟:
-6 11111111 11111111 11111111 11111010(補碼,原碼取反再加1)
>> ---------------------------------------------------------
-3 10000000 00000000 00000000 000000110
>>>(無符號右移):所有位向右移動一位,相當於除以2,高位用0補齊
如:6>>1=3,看步驟:
6      00000000 00000000 00000000 00000110
>>> ---------------------------------------------------------
3    00000000 00000000 00000000 000000110
-6>>>1=2147483645,看步驟:
-6   11111111 11111111 11111111 11111010(補碼,原碼取反再加1)
>>> -----------------------------------------------------------------
2147483645 01111111 11111111 11111111 111111010


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM