位运算符的作用以及用位运算符求平均值的两种方法

位运算符的基本作用:

位运算符是用来对二进制数操作的,有六个运算符:|:按位或,&:按位与,~:按位取反,^:按位异或,<<:按位左移,
>>:按位右移,其中除了~按位取反是双目运算符,其他的全部是单目运算符,位运算符的操作数只能是整形和字符
型数据,
   各个位运算符的用法如下所示:
(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;
}    

 

 

posted @ 2017-10-21 12:20  小乖不乖  阅读(3265)  评论(1编辑  收藏  举报