位运算归纳(进阶)

Posted 一只特立独行的猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位运算归纳(进阶)相关的知识,希望对你有一定的参考价值。

为了便于描述,都是以例子的形式进行讲述。是本人在准备蓝桥杯国赛的时候,看视频的归纳,如果有不当之处,还望大家在评论区留言。

1.列举排列情况
如果有30个开关,每次可以随意开n个(0<n<31),要求得到所有的排列情况。(相当的暴力,一般情况下不推荐用,一般这种题用dp做,但是小规模简单题可以用这个方法,代码简单,写的快)
解法:

for(int i=0;i<1<<30;i++){
	//pass;
	for(int j=0;j<30;j++){
		//倒序输出所有排列
		cout<<i&1;
		i>>1;
	}
}

2.判断一个数的二进制位中有几个1,每次从低位消除一个1。

int cnt=0;
while(x!=0){
	cnt++;
	x&=(x-1);
}

3.找到原数的二进制位从低位到高位第一个1的位置。

x&=(-x);
int cnt=0;
while(x!=0){
	x>>1;
	cnt++;
}
cout<<cnt;
//输出x的第一个1在第几位

4.在数列a中,除了x只出现了一次,其余数都出现了两次,在a中找x。
原理:0异或上任何数都是他本身,x^x等于0

int x=0;
for(int y : a){
	x^=y;
}
cout<<x;
//x就是最终的解

以上是关于位运算归纳(进阶)的主要内容,如果未能解决你的问题,请参考以下文章

C语言指针全归纳-进阶版

位运算简介及实用技巧:进阶篇[转]

算法进阶:0x01 位运算

算法竞赛进阶指南基本算法-位运算

老寇云-java技术栈进阶-武侠篇-位运算之异或运算

《算法零基础100讲》(第45讲) 位运算 (位或) 进阶