位運算不管是在Java語言,還是在C語言中,或者其他語言,都是經常會用到的,所以本文也就不固定以某種語言來舉例子了,原始點就從0、1開始。位運算主要包括按位與(&)、按位或(|)、按位異或(^)、取反(~)、左移(<<)、右移(>>)這幾種,其中除了取反(~)以外,其他的都是二目運算符,即要求運算符左右兩側均有一個運算量。
1、補碼
在總結按位運算前,有必要先介紹下補碼的知識,我們知道當將一個十進制正整數轉換為二進制數的時候,只需要通過除2取余的方法即可,但是怎麼將一個十進制的負整數轉換為二進制數呢?其實,負數是以補碼的形式表示,其轉換方式,簡單的一句話就是:先按正數轉換,然後取反加1。
要將十進制的-10用二進制表示,先將10用二進制表示:
0000 0000 0000 1010
取反:
1111 1111 1111 0101
加1:
1111 1111 1111 0110
所以,-10的二進制表示就是:1111 1111 1111 0110
2、按位與(&)
參加運算的兩個數,換算為二進制(0、1)後,進行與運算。只有當相應位上的數都是1時,該位才取1,否則該為為0。
將10與-10進行按位與(&)運算:
0000 0000 0000 1010
1111 1111 1111 0110
———————–
0000 0000 0000 0010
所以:10 & -10 = 0000 0000 0000 0010
3、按位或(|)
參加運算的兩個數,換算為二進制(0、1)後,進行或運算。只要相應位上存在1,那麼該位就取1,均不為1,即為0。
將10與-10進行按位或(|)運算:
0000 0000 0000 1010
1111 1111 1111 0110
———————–
1111 1111 1111 1110
所以:10 | -10 = 1111 1111 1111 1110
4、按位異或(^)
參加運算的兩個數,換算為二進制(0、1)後,進行異或運算。只有當相應位上的數字不相同時,該為才取1,若相同,即為0。
將10與-10進行按位異或(^)運算:
0000 0000 0000 1010
1111 1111 1111 0110
———————–
1111 1111 1111 1100
所以:10 ^ -10 = 1111 1111 1111 1100
可以看出,任何數與0異或,結果都是其本身。利用異或還可以實現一個很好的交換算法,用於交換兩個數,算法如下:
a = a ^ b;
b = b ^ a;
a = a ^ b;
5、取反(~)
參加運算的兩個數,換算為二進制(0、1)後,進行取反運算。每個位上都取相反值,1變成0,0變成1。
對10進行取反(~)運算:
0000 0000 0000 1010
———————
1111 1111 1111 0101
所以:~10 = 1111 1111 1111 0101
6、左移(<<)
參加運算的兩個數,換算為二進制(0、1)後,進行左移運算,用來將一個數各二進制位全部向左移動若干位。
對10左移2位(就相當於在右邊加2個0):
0000 0000 0000 1010
——————–
0000 0000 0010 1000
所以:10 << 2 = 0000 0000 0010 1000 = 40
注意,觀察可以發現,左移一位的結果就是原值乘2,左移兩位的結果就是原值乘4。
7、右移(>>)
參加運算的兩個數,換算為二進制(0、1)後,進行右移運算,用來將一個數各二進制位全部向右移動若干位。
對10右移2位(就相當於在左邊加2個0):
0000 0000 0000 1010
——————–
0000 0000 0000 0010
所以:10 >> 2 = 0000 0000 0000 0010 = 2
注意,觀察可以發現,右移一位的結果就是原值除2,左移兩位的結果就是原值除4,注意哦,除了以後沒有小數位的,都是取整。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/281274.html
微信掃一掃
支付寶掃一掃