本文為 Crocutax 原創(chuàng),轉(zhuǎn)載請注明出處 http://www.crocutax.com
擼代碼時間越長,越體會到的基礎(chǔ)知識的重要性,研究原理越多,越感覺到數(shù)據(jù)結(jié)構(gòu)和算法的重要性。這些東西在日常的業(yè)務(wù)代碼中體會不是很明顯,但是一旦稍微往深了研究,立刻就能發(fā)現(xiàn)自己不足。
今天在看源碼的時候,發(fā)現(xiàn)居然忘記了位運算符是怎么玩的了,趕緊回顧了一下,順便寫個筆記記錄一下,加深下印象。
位運算符主要針對二進制數(shù),包括以下幾種:
- & 與運算符
- | 或運算符
- ^ 異或運算符
- ~ 非運算符
& 與運算符
規(guī)則:兩個二進數(shù)對應(yīng)bit位上的數(shù)都為1時,值為1,否則為0.類似于求1的交集.
例如:
128的二進制表示:00000000 00000000 00000000 10000000
129的二進制表示:00000000 00000000 00000000 10000001
128&129的結(jié)果 :00000000 00000000 00000000 10000000 (十進制值為 128)
| 或運算符
規(guī)則:兩個二進數(shù)對應(yīng)bit位上的數(shù)只要有一個為1,則值為1,否則為0.類似于求1的并集.
例如:
128的二進制表示:00000000 00000000 00000000 10000000
129的二進制表示:00000000 00000000 00000000 10000001
128 | 129的結(jié)果 :00000000 00000000 00000000 10000001 (十進制值為 129)
^ 異或運算符
規(guī)則:兩個二進數(shù)對應(yīng)bit位上的數(shù),相同則為0,不同則為1.
例如:
128的二進制表示:00000000 00000000 00000000 10000000
129的二進制表示:00000000 00000000 00000000 10000001
128 ^ 129的結(jié)果:00000000 00000000 00000000 00000001 (十進制值為 1)
~ 非運算符
規(guī)則:如果該bit位上數(shù)值是0,則為1;如果是1,則為0.也就是取反運算.
例如:
129的二進制表示:00000000 00000000 00000000 10000001
~129的計算結(jié)果 :11111111 11111111 11111111 01111110 (注意此時仍為補碼)
根據(jù)補碼求反碼 : 11111111 11111111 11111111 01111101
根據(jù)反碼求原碼 : 10000000 00000000 00000000 10000010 (十進制值為 -130)
取反公式: ~(x) = -1*(x+1);
例: 6取反=-7 ; 9取反=-10 ; 129取反=-130
代碼測試
public class Test {
public static void main(String[] args) {
int a = 128;
int b = 129;
System.out.println("128 & 129: "+(128 & 129));
System.out.println("128 | 129: "+(128 | 129));
System.out.println("128 ^ 129: "+(128 ^ 129));
System.out.println("~129 : "+(~129));
}
}
Log輸出:
128 & 129: 128
128 | 129: 129
128 ^ 129: 1
~129 : -130