目录
这其实是位操作符的一种应用,如果能熟练掌握位操作符,真的可以发现新大陆!!
先简单介绍一下常用的位操作符
& : 按位与(只有两个二进制位位同时为1,结果才为1,否则为0)
| : 按位或(只要有一个二进制位是1,结果就是1,只有两位都是0 ,结果才为0)
^ : 按位异或(两个二进制位相同结果为0,不同结果为1)
<< : 把二进制位左移一位
>> : 把二进制位右移一位
~ : 把二进制位全部取反
位操作符的应用:统计二进制中1的个数
方法一:先求二进制位,再统计
思路:
循环进行以下操作,直到整数n被缩减为0:
1. 用n模(%)2,检测其是否能够被2整除
2. 如果可以:则n对应二进制比特位的最低位一定是0,否则是1,如果是1给计数加1
3. 如果n不等于0时,继续第1步
代码实现:
int count_one_bit(int n)
{
int count = 0;
while(n)
{
if(n%2==1)
count++;
n = n/2;
}
return count;
}
缺陷:
进行了大量的取模以及除法运算,取模和除法运算的效率本来就比较低。
方法二:位运算(整数的每个二进制位 & 1)
代码实现:
int count_one_bit(unsigned int n)
{
int count = 0;
int i = 0;
for(i=0; i<32; i++)
{
if(((n>>i)&1) == 1)
count++;
}
return count;
}
优点:
用位操作代替取模和除法运算,效率稍微比较高
缺陷:
不论是什么数据,循环都要执行32次
方法三:采用相邻的两个数据进行按位与运算
思路:
令n = n & (n-1),一直循环
此种方式,数据的二进制比特位中有几个1,就循环几次,知道n为0为止
代码实现:
int count_one_bit(int n)
{
int count = 0;
while(n)
{
n = n&(n-1);
count++;
}
return count;
}