位運算符的基本作用:
位運算符是用來對二進制數操作的,有六個運算符:|:按位或,&:按位與,~:按位取反,^:按位異或,<<:按位左移,
>>:按位右移,其中除了~按位取反是雙目運算符,其他的全部是單目運算符,位運算符的操作數只能是整形和字符
型數據,
各個位運算符的用法如下所示:
(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)>>按位右移:將二進制數向右移右值(位運算符右邊的數)數的位,左邊補符號位,相當與除法,和按位左移一樣,是
多少進制就除以多少進制,存在整除問題,結果向零靠近
用位運算符實現求平均數:
第一種方法:((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,就是平均數了,他的代碼如下圖所示:
#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的平均數了,&將兩個數
一樣的部分提出來一半,異或將兩個數不一樣的數提出來了,再右移一位,相當於提出來了一半,將他們相同的和不
相同各提出來一半就是平均數。
代碼如下圖所示:
#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; }