一、先聊聊存在哪些位运算:
1、&(与) —— 有0则0;无0则1;
2、|(或) —— 有1则1,无1则0;
3、^(亦或) —— 相同为0,不同为1;
4、>>右移(最右边的位被抛弃)
正数,最左边添0;00001010>>3=00000001
负数,最左边添1;10001010>>3=11110001
5、<<左移(最左边的位被抛弃) —— 最右边统一加0;(正数) 00001010<<3=01010000
(负数) 10001010<<3=01010000
二、具体编程实现,核心代码
2.1 方法一:通过“与”和“左移”操作实现
#include<iostream>
using namespace std;
int NumberOf1(int n)//有符号的n
{
int count=0;
int flag=1;
while (flag)
{
if (n&flag)
{
count++;
}
flag=flag<<1;//左移一位
}
return count;
}
int main()
{
cout<<NumberOf1(9)<<endl;//1001
cout<<NumberOf1(15)<<endl;//1111
return 0;
}
2.2、方法二:只通过“与”操作实现
- #include<iostream>
- using namespace std;
- int NemberOf1(int n)
- {
- int count =0;
- while (n)
- {
- count++;
- n=n&(n-1);
- }
- return count;
- }
- int main()
- {
- cout<<NemberOf1(9)<<endl;//1001
- cout<<NemberOf1(15)<<endl;//1111
- return 0;
- }
三、实现int数中二进制0的个数,核心代码
- int Grial(int x)
- {
- int count = 0;
- while (x + 1)
- {
- count++;
- x |= (x + 1);
- }
- return count;
- }