第一讲算法基础—位运算

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值