一.6acw位运算

(n>>k&1) 是一个位运算的表达式,它的含义如下:

  1. n >> k: 这个操作将变量 n 的二进制表示向右移动 k 位。例如,如果 n 的二进制表示为 1010,而 k 的值为 2,那么 n >> k 的结果就是 10,即 0010

  2. &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
--------------------------------

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白天的我最菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值