1.返回n的二进制表示中第k位上的数字
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int k;
cin>>k;
n=n>>(k-1);//将n右移到第k位
cout<<(n&1)<<endl;
return 0;
}
升级:直接打印出n的二进制表示
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
for (int i = 31; i>=0; i--)
{
cout << ((n >> i)&1);
}
cout << endl;
return 0;
}
输入 | 输出 |
198 | 00000000000000000000000011000110 |
205 | 00000000000000000000000011001101 |
2. lowbit算法:返回x的最后一位1
公式:x&(-x)
思想:正负数之间补码的转化就是补码取反加1
输入 | 输出 |
18 | 2 |
24 | 8 |
#include<iostream>
using namespace std;
int main()
{
int x;
cni>>X;
int ans=x&(-x);
cout<<ans<<endl;
return 0;
}
应用:求x的二进制表示中1的个数
思想:每次用lowbit找到最后一位1,然后剪掉该位置后面的数,更新,寻找下一个1.
#include<iostream>
using namespace std;
int main()
{
int x;
cin >> x;
int ans = 0;
while (x&(-x))
{
ans++;
x -= x&(-x);//删除被记录过的1后面的数
}
cout << ans << endl;
return 0;
}
输入 | 输出 |
146(00000000000000000000000010010010) | 3 |
2527(00000000000000000000100111011111) | 9 |
2023/1/7 by shybee