一.1 基础算法—位运算
位运算的两种常用操作
- 1.返回第k位的二进制数: n>>k&1
- 2.返回n的最后一位1: lowbit(n)=x&-x
返回第k位的二进制数: n>>k&1
二进制数:1111
位数: 3210 初始位数从0开始
1.n>>k位串右移:表示在第k位后删去k个0
2.n<<k位串左移:表述在第k位后添上k个0
n>>k:把第k位的数字移动到最右边
n>>k&1:求出第k位是1还是0
利用这个我们可以将十进制数字转换为二进制
#include <iostream>
using namespace std;
int main()
{
int n=10;
for (int k=3;k>=0;k--) cout<< (n>>k&1);
return 0;
}
返回n的最后一位1: lowbit(n)=x&-x
lowbit(10100) (2进制)=100
lowbit(101000)(2进制)=1000
在C++中 -x是x的补码 即~x+1 取反x+1
例如:
x (原码): 10001000
~x (反码): 01110111
~x+1(补码): 01111000
x&(~x+1) : 00001000
利用这个我们可以统计数的二进制中1的个数
#include<iostream>
using namespace std;
int lowbit(int x)
{
return x&-x;
}
int main()
{
int n;cin>>n;
while(n--)
{
int x;cin>>x;
int res=0;
while(x)
{
x-=lowbit(x);
res++;
}
cout<<res<<" ";
}
return 0;
}return 0;
}