按位運(yùn)算符有6個(gè)
& 按位與????????| 按位或????????^按位異或????????~取反????????>>右移????????<<左移

1 、& 運(yùn)算符
&是二元運(yùn)算符,它以特定的方式的方式組合操作數(shù)中對(duì)應(yīng)的位 如果對(duì)應(yīng)的位都為1,那么結(jié)果就是1, 如果任意一個(gè)位是0 則結(jié)果就是0
1 & 3的結(jié)果為1
來(lái)看看它的怎么運(yùn)行的:
1的二進(jìn)制表示為 0 0 0 0 0 0 1
3的二進(jìn)制表示為 0 0 0 0 0 1 1
根據(jù) & 的規(guī)則 得到的結(jié)果為 0 0 0 0 0 0 0 1,十進(jìn)制表示就是1
只要任何一位是0 &運(yùn)算的結(jié)果就是 0,所以可以用&把某個(gè)變量不必要的位設(shè)為0, 比如某個(gè)變量的二進(jìn)制表示為 0 1 0 0 1 0 0 1, 我想保留低4位,消除高4位 用 & 0x0F就可以了(注:0x0F為16進(jìn)制表示法,對(duì)應(yīng)的二進(jìn)制為 0 0 0 0 1 1 1 1),這個(gè)特性在編碼中使用很廣泛。
2 、| 運(yùn)算符
如果對(duì)應(yīng)的位中任一個(gè)操作數(shù)為1 那么結(jié)果就是1
1 | 3 的結(jié)果為3
3、 ^ 運(yùn)算符
^ 運(yùn)算符跟 | 類似,但有一點(diǎn)不同的是 如果兩個(gè)操作位都為1的話,結(jié)果產(chǎn)生0
0 1 0 0 0 0 0 1
0 1 0 1 1 0 1 0
產(chǎn)生 0 0 0 1 1 0 1 1
4 、~ 運(yùn)算符
~是對(duì)位求反 1變0, 0變1
5 、移位運(yùn)算符移位運(yùn)算符把位按指定的值向左或向右移動(dòng)
<< 向左移動(dòng) 而 >> 向右移動(dòng),超過(guò)的位將丟失,而空出的位則補(bǔ)0
如 0 1 0 0 0 0 1 1(十進(jìn)制67) 向左移動(dòng)兩位67<<2將變成
0 0 0 0 1 1 0 0 (十進(jìn)制12)當(dāng)然如果你用java代碼寫(xiě),由于是32位,不會(huì)溢出,結(jié)果是268
向右移動(dòng)兩位67>>2則是
0 0 0 1 0 0 0 0(十進(jìn)制16)
一些具體的應(yīng)用
前面提到2向前移動(dòng)1位變成4 利用這個(gè)特性可以做乘法運(yùn)算(在不考慮溢出和符號(hào)位的情況下)
2 << 1 =4
3 << 1 = 6
4 << 1 = 8
同理 >> 則可以做除法運(yùn)算
任何小數(shù) 把它 >> 0可以取整
如3.14159 >> 0 = 3;
^運(yùn)算服有個(gè)神奇的特性
如以下代碼
————————————————
int n1=3;
int n2=4;
n1 ^= n2;
n2 ^= n1;
n1 ^= n2
————————————————
最后我們發(fā)現(xiàn),n1=4,n2=3,兩者互換了值
