位运算及其实现方式

位运算最常用的两种操作

n的二进制表示中第k位是几:
先理解在二进制中的第几位的含义:在二进制中是从个位数开始依次向前标为0,1,2,3等
如下图所示:
在这里插入图片描述
红色的部分表示的是第几位。
明白了这个步骤后,接下来进行理解具体的操作步骤:
1.将第k位数字移到个位数上,涉及到了右移运算:n >> k
注解:1010右移一位:101, 右移两位:10, 三位:1

2.输出个位上的数字,此时个位上的数字就是我们要求的第k位的数字,x & 1代表的就是取出x中二进制中的个位数字
综上所述,所给操作只需要:n >> k & 1就能完成

例:取出10前三位的数字

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n = 10;
	for(int i = 3; i >= 0; i -- )cout << (n >> i & 1);
	return 0;
}

Lowbit(x)运算

作用:返回x的二进制码中的最后一个1.(最右边的一个1)
例如:

x = 10;//二进制位1010
lowbit(x) = 10
x = 101000;//某数转化为二进制后的形式
lowbit(x) = 1000;

lowbit(x)的实现原理:
实现原理为:x & -x
注解:在c ++中,-x为x的补码形式,又等价于x的取反加1(~x + 1)(均为二进制表示)
例如:x = 1001010010000100000000
~x = 0110101101111011111111,则~x + 1 = 0110101101111100000000
x & -x = 0000000000000100000000

实际用法:可以进行统计x里面1的个数(二进制码)
例题:
给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1的个数。

输入格式
第一行包含整数 n,第二行包含 n个整数,表示整个数列。

输出格式
共一行,包含 n个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中 1的个数。

数据范围
1≤n≤100000,
0≤数列中元素的值≤109

输入样例

5
1 2 3 4 5

输出样例:

1 1 2 1 2
#include<bits/stdc++.h>
using namespace std;
int lowbit(int x)
{
	return x & -x;
}
int main()
{
	int n;
	cin >> n;
	while(n -- )
	{
		int a;
		cin >> a;
		int res = 0;
		while(a) a -= lowbit(a), res ++ ;//每一次当a不为0的时候,就把最后一位的1减去,用res进行计数,最后res的值记为删去的1的个数,也是原数中1的个数
		cout << res << ' ';
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值