位运算
-
lowbit(x)
:返回x的最后一位1。eg. x=6 => x=(110)
2
=>lowbit(x)=10
.int lowbit(int x) { return x&(-x); }
&:按位与运算。
-x:取x的反码,即x二进制每位取反之后+1,即-x=(~x+1)。
eg.实现方式 x =1010100; ~x =0101011; ~x+1 =0101100; x&(-x)=0000100;
-
例题:二进制中1的个数
给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。 输入格式:第一行包含整数 n。第二行包含 n 个整数,表示整个数列。 输出格式:共一行,包含 n 个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 1 的个数。 数据范围:1≤n≤100000,0≤数列中元素的值≤1e9
eg. #include<stdio.h> int lowbit(int x) { return x & (-x); } int main() { int n,ans,x; scanf("%d", &n); while (n--) { scanf("%d", &x); ans = 0; while (x) { x -= lowbit(x);//减去最后一位1 ans++;//减的次数=1的个数 } printf("%d ", ans); } return 0; }