運算符 & | ^ ~ >> << 講解


字節”是byte,“位”是bit ;1 byte = 8 bit ;

char 在java中是2個字節。java采用unicode,2個字節(16位)來表示一個字符。

char 16位2個字節

byte 8位1個字節

short 16位2個字節

int 32位4個字節

long 64位8個字節

float 32位 4個字節

double 64位8個字節

可以算一下 0x7FFFFFFF 是多少
每個十六進制數4bit,因此8位16進制是4個字節,剛好是一個int整型
F的二進制碼為 1111
7的二進制碼為 0111
這樣一來,整個整數 0x7FFFFFFF 的二進制表示就是除了首位是 0,其余都是1
就是說,這是最大的整型數 int(因為第一位是符號位,0 表示他是正數)

按位運算符是把操作數看作一系列單獨的位,而不是一個數字值。所以在這之前,不得不提到什么是“位”:
數值或字符在內存內都是被存儲為0和1的序列,每個0和1被稱之為1個位,比如說10進制數據2在計算機內被存儲為 0 0 0 0 0 0 1 0(此處以一字節為例,具體位數,由所使用編程語言決定),當我們將內存內的位值改變之后,這個值代表的意義也就變了,比如把2前移動一位, 現在存儲單元里面變成了0 0 0 0 0 1 0 0,這個值表示的是十進制的4,這也就是按位操作符的運算原理。

按位運算符有6個
& 按位與
|按位或
^按位異或
~取反
>>右移
<<左移

1 、& 運算符
&是二元運算符,它以特定的方式的方式組合操作數中對應的位 如果對應的位都為1,那么結果就是1, 如果任意一個位是0 則結果就是0
1 & 3的結果為1
來看看它的怎么運行的:
1的二進制表示為 0 0 0 0 0 0 1
3的二進制表示為 0 0 0 0 0 1 1
根據 & 的規則 得到的結果為 0 0 0 0 0 0 0 1,十進制表示就是1
只要任何一位是0 &運算的結果就是 0,所以可以用&把某個變量不必要的位設為0, 比如某個變量的二進制表示為 0 1 0 0 1 0 0 1, 我想保留低4位,消除高4位 用 & 0x0F就可以了(注:0x0F為16進制表示法,對應的二進制為 0 0 0 0 1 1 1 1),這個特性在編碼中使用很廣泛。

2 、| 運算符
| 跟 & 的區別在於 如果對應的位中任一個操作數為1 那么結果就是1
1 | 3 的結果為3
3、 ^ 運算符
^運算符跟 | 類似,但有一點不同的是 如果兩個操作位都為1的話,結果產生0
0 1 0 0 0 0 0 1
0 1 0 1 1 0 1 0
產生 0 0 0 1 1 0 1 1
4 、~ 運算符
~是對位求反 1變0, 0變1
5 、移位運算符移位運算符把位按指定的值向左或向右移動
<< 向左移動 而 >> 向右移動,超過的位將丟失,而空出的位則補0
如 0 1 0 0 0 0 1 1(十進制67) 向左移動兩位67<<2將變成
 0 0 0 0 1 1 0 0 (十進制12)當然如果你用java代碼寫,由於是32位,不會溢出,結果是268
向右移動兩位67>>2則是
0 0 0 1 0 0 0 0(十進制16)

下面介紹一些具體的應用
前面提到2向前移動1位變成4 利用這個特性可以做乘法運算(在不考慮溢出和符號位的情況下)
2 << 1 =4
3 << 1 = 6
4 << 1 = 8
同理 >> 則可以做除法運算

任何小數 把它 >> 0可以取整
如3.14159 >> 0 = 3;

^運算服有個神奇的特性
如以下代碼
---------------------
 

    int n1=3;
    int n2=4;
    n1 ^= n2;
    n2 ^= n1;
    n1 ^= n2;

最后我們發現,n1=4,n2=3,兩者互換了值


免責聲明!

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



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