(n>>k&1)
是一个位运算的表达式,它的含义如下:
n >> k
: 这个操作将变量n
的二进制表示向右移动k
位。例如,如果n
的二进制表示为1010
,而k
的值为2
,那么n >> k
的结果就是10
,即0010
。
&1
: 这个操作会将n >> k
的结果与1
进行位与操作。由于1
的二进制表示是0001
,那么位与操作的结果就是取n >> k
二进制表示的最低位。如果最低位为1
,结果就是1
;如果最低位为0
,结果就是0
。所以,
(n>>k&1)
实际上是获取n
的二进制表示中从右往左数第k
位的值,只返回0
或者1
。在给定的代码中,循环用来依次输出n
的二进制表示从最高位到最低位的值。
位运算表示方法:
cout << (n >> k & 1);
在每次循环中,将变量n右移k位(相当于将n的二进制表示向右移动k位),然后与数字1进行按位与操作。将结果输出到标准输出流cout中。
由于k的初始值是3,所以在第一次循环中,n将被右移3位,输出最高位的二进制位;第二次循环中,n将被右移2位,输出次高位的二进制位;以此类推,直到循环结束时输出最低位的二进制位。
这段代码的功能是将变量n的十进制值10转换为二进制表示,并从高位到低位逐位输出到屏幕上
二进制中1的个数:
lowbit(x)返回x的最右边的一位1。lowbit实现的是x&-x
x&-x=x&(~x+1)
x=1010...100...0
~x=0101...01...1
~x+1=0101...10...0
x&(~x+1)=0...010...0
c++没有负数,用补码来代替,补码为反码加一
&位与运算
x&(~x+1)=x&-x//取反加一
#include <iostream>
using namespace std;
//二进制中1的个数
int main(){
int n;
scanf("%d",&n);
while(n--){
int x,s=0;
scanf("%d",&x);
for(int i=x;i;i-=i&-i)s++;//i大于0就行
printf("%d ",s);
}
return 0;
}
5
1 2 3 4 5
1 1 2 1 2
--------------------------------