关于位运算

目录

逻辑运算符

位与:

位或:

异或:

按位取反:

位移运算符

左移:

右移:

应用

2的幂

4的幂

位1的个数

交换数字

只出现一次的数字

汉明距离

交替位二进制数


简介

位运算分为两大类:逻辑运算符和位移运算符

逻辑运算符

位与:

&

如果两个相应的二进制位都为1,则该位的结果值为1,否则为0

位或:

|

两个相应的二进制位中只要有一个为1,该位的结果值为1

异或:

^

若参加运算的两个二进制位值相同则为0,否则为1

按位取反:

~

对一个二进制数按位取反,即将0变1,将1变0

位移运算符

左移:

<<

将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。

右移:

>>

将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

<<=左移且赋值运算符C <<= 2 等同于 C = C << 2
>>=右移且赋值运算符C >>= 2 等同于 C = C >> 2
&=位与且赋值运算符C &= 2 等同于 C = C & 2
^=位异或且赋值运算符C ^= 2 等同于 C = C ^ 2
|=位或且赋值运算符C |= 2 等同于 C = C | 2

应用

2的幂

给定一个整数n,如果他是2的幂,返回yes;否则返回no。

要知道一个数如果是2的幂次方,那么他的二进制表示形式中,只有可能刚好有1个1出现,(当然要排除负数)

用n&(n-1)因为恰好二进制形式只有1个1,无论在哪一位上,那么n-1一定向下降位数,恰好和n的二进制数的1的位置相邻错开了,故位与运算结果为0

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	if(n>0&&(n&(n-1))==0)
		cout<<"yes";
	else 
		cout<<"no";
	return 0;
} 

4的幂

给定一个整数n,如果他是4的幂,返回yes;否则返回no。

在2的幂前提下

1、4的幂一定是2的幂

2、2的偶数次幂模除3是1;2的奇数次幂模除3是2

3、2的偶数次幂就是4的幂

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	if(n>0&&(n&(n-1))==0&&n%3==1)
		cout<<"yes";
	else 
		cout<<"no";
	return 0;
} 

位1的个数

输入是一个整数,返回其二进制表达式中数字位为1的个数

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,cnt=0;
	cin>>n;
	while(n)
	{
		n&=(n-1);
		++cnt;
	}
	cout<<cnt;
	return 0;
} 

交换数字

不用临时变量,交换a和b的值

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int a,b;
	cin>>a>>b;
	a=a^b;
	b=a^b;
	a=a^b;
	cout<<a<<endl;
	cout<<b<<endl;
	return 0;
} 

(这是由异或的性质决定的。0^a = a; a^a = 0) 

所以代码含义其实是:

a=a^b

b=a^b=a^b^b=a^0=a;

a=a^b=a^b^a=a^a^b=0^b=b;

只出现一次的数字

给定一个非空整数数组,除了某个数字只出现过一次以外,其余数字均出现两次,找出那个只出现了一次的数字

 (这不就是异或的应用吗,0^a = a; a^a = 0,所以把整个数组都异或一遍,那么出现两次的数字就消失了,只剩下出现一次的数字

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int ans,n,a[1000];
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	for(int i=0;i<n;i++)
	{
		ans=ans^a[i];
	}
	cout<<ans;
	return 0;
} 

汉明距离

汉明距离指的是两个数字对应的二进制位不同的位置的数目。给定x,y,计算他们之间的汉明距离

(咱就是说这不就是求位1的个数)

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,x,y,cnt=0;
	cin>>x>>y;
	n=x*y;
	while(n)
	{
		n&=(n-1);
		++cnt;
	}
	cout<<cnt;
	return 0;
} 

交替位二进制数

给定一个正整数n,检查它的二进制表示是否总是0,1交替出现。

(用了右移运算符和位与运算符)

1、首先我们要知道

二进制十进制
000
113

2、所以只需要从低到高不断位与3

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,cnt=0,flag=1;
	cin>>n;
	while(n)
	{
		if((n&3)==3||(n&3)==0)
			flag=0;//不是交替位二进制数 
		n>>=1;
	}
	if(flag==1)
		cout<<"yes";
	else
		cout<<"no";
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值