1.模板
①求n的第k位数字: n >> k & 1
②返回n的最后一位1:lowbit(n) = n & -n
2.模板解释以及例题
①模板常应用于 n的二进制表示中第k位是几
先把第k位移到最后一位,即n>>k;
看个位是几,即&1;
注意:
实现:
#include <iostream>
using namespace std;
int main() {
int n = 10;
for (int k = 3; k >= 0; k--) {
cout << (n >> k & 1) << endl;
}
return 0;
}
②lowbit(x) :返回x的最后一位1 模板常应用于统计一个数的二进制中有多少1
x=1010 lowbit(x)=10
x=101000 lowbit(x)=1000
它返回的是一个二进制数,返回回来的最高一位1就是x的最后一位1
lowbit(x)的实现
-x=~x+1
所以 x&-x=x&(~x+1)
x=1010........100...0
~x=0101.......011...1
~x+1=0101.......100...0
x&(~x+1)=0000.......100...0
思想:每一次把最后一位1减去,当x等于0的时候就没有1了,当x减去多少次就说明就有多少个1
实现
#include <iostream>
using namespace std;
int lowbit(int x) {
return x & -x;
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
int x;
int ans = 0;
cin >> x;
while (x) {
ans++;
x = x - lowbit(x);
}
cout << ans << " ";
}
return 0;
}