位運算符的基本做用:spa
位運算符是用來對二進制數操做的,有六個運算符:|:按位或,&:按位與,~:按位取反,^:按位異或,<<:按位左移,
>>:按位右移,其中除了~按位取反是雙目運算符,其餘的所有是單目運算符,位運算符的操做數只能是整形和字符
型數據,
各個位運算符的用法以下所示:
(1)|:按位或,兩個數只要有一個是1就是1,例如8|5,8的二進制數是00001000,5的二進制數是:00000101,8|5的值
就是00001101,十進制爲13,位運算或其實能夠當作將兩個數不同的地方和同樣的地方提出來,由於1|1等於1,
因此說只提出來了一半,兩個1最後成了一個1,因此說只提出來一半
(2)&:按位與,兩個數都爲1(真)結果才爲1(真),不然爲0(假),例如8&5,8的二進制數是00001000,5的二進制
數是:00000101,8&5的值爲00000000,位運算符&其實能夠當作是將兩個數同樣的地方提出來一半,和或運算同樣
1&1以後就只剩下了一個1,對於兩個數來講,也只算提出來了一半
(3)~:按位取反:就是遇到1將他變成0;把0變成1就好,計算一個負數的十進制數是多少時,就將他按位取反再加1轉化
成十進制就好
(4)^:按位異或:兩個數不同就爲1,不然爲0,例如8^5,8的二進制數是00001000,5的二進制數是:00000101,8^5的
值就是00001101,00001100,位運算符異或能夠當作是將兩個數不同的地方提出來。
(5)<<按位左移:將二進制數向左移右值(位運算符右邊的數)數的位,右邊(低位)補0,至關於將原數乘2,對幾進制
數操做就至關於乘以多少進制,若是對八進制數操做就至關於乘以8,對十六進制數操做就至關於乘以16,例如17
的二進制數是00010001,左移以後:00100010,換算成十進制數就是34,至關於17*2,17的八進制是021,左移以後:210
左移一位以後至關與乘以8,210的十進制數就是136等於17*8。
(6)>>按位右移:將二進制數向右移右值(位運算符右邊的數)數的位,左邊補符號位,至關與除法,和按位左移同樣,是
多少進制就除以多少進制,存在整除問題,結果向零靠近
用位運算符實現求平均數:code
第一種方法:((x&y)+(x|y))>>1,例如9和7,9的二進制數是00001001,7的二進制數是00000111,9&7
爲00000001,他的十進制數爲1,9|7:00001111他的十進制數爲15,兩個數加起來就是16,將他右移一位就是除以2的
意思,16/2等於8,而8就是9和7的平均值,其實質就是,對於兩個數來講,&就是將兩個數同樣的部分提出來了一半,
|將兩個數不同的部分全提出來和同樣的部分提出來一半,因此兩個數同樣的部分和不同的部分就全提了出來,就
至關於兩數之和,再右移一位除以2,就是平均數了,他的代碼以下圖所示:blog
#include <stdio.h> int everage (int x,int y) { return(((x&y)+(x|y))>>1); } int main () { printf("%d\n",everage (9,7)); return 0; }
第二種方法
(9&7)+((9^7)>>1)和上面的例子同樣9和7,他們的二進制數就不寫了,上面的例子有,9&7上面已經算出來了:
00000001,也就是1,9^7爲00001110,再右移一位就是00000111,十進制數爲7,7+1就是9和7的平均數了,&將兩個數
同樣的部分提出來一半,異或將兩個數不同的數提出來了,再右移一位,至關於提出來了一半,將他們相同的和不
相同各提出來一半就是平均數。io
代碼以下圖所示:class
#include <stdio.h> int everage1 (int x,int y) { return ((x&y)+((x^y)>>1)); } int main () { printf("%d\n",everage1 (9,7)); printf("%d\n",everage1 (10,8)); return 0; }