取出某个数的二进制表示的第k位是几
原码:10001000
反码:01110111
补码:01111000
补码 = ~原码 + 1
计算机中负数以补码的形式存储
n >> k & 1
比如12(10) = 1100(2),k指的是个位是从第0位开始倒着来查的,例如:要求12的第零位是什么,那么12 >> 0 & 1,得到0, 求第三位就是12 >> 3 & 1,得到1
lowbit()返回x的最后一位1及后面的0
例如x(2) = 10100,,lowbit(x)后就是100
lowbit(x) = x & -x;
#include <iostream>
using namespace std;
int lowbit(int x)
{
return x & -x;
}
int main()
{
int n;
cin >> n;
while(n -- )
{
int x;
int res = 0;
cin >> x;
while(x) x -= lowbit(x), res ++;
cout << res << ' ';
}
return 0;
}