一、求解二进制表示的第k位数字
#include<iostream>
using namespace std;
int main()
{
int n = 10; // 例如,十进制10用二进制表示为1010
for(int k=3;k>=0;k--)
cout << (n >> k & 1);
// 第一步:右移k位
// 第二步: & 1,即 与1
return 0;
}
二、 lowbit计算x二进制表示中1的数目
关于函数lowbit
在C++中,x & (-x) == x & (~x + 1)
根据以上等式,在二进制表示下,那么lowbit(x)的返回值有如下规律:
1、若x == 101010000,则返回值为10000
2、若x == 101011000,则返回值为1000
3、若x == 1010100010,则返回值为10
即lowbit(x)的返回值保留了x最右边的一个1以及这个1右边的所有0
关于如何使用lowbit计算x二进制表示中1的数目
根据上面的论述,在x变为0之前,每次将x减去lowbit(x),
并记录减操作的次数,该次数就是x二进制表示中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 num = 0;
while(x) x -= lowbit(x) , num ++ ;
cout << num << " " ;
}
return 0;
}