高级操作符——位操作符讲解(移位操作符~ 按位与'&'操作符~ 按位或'|'操作符~ 按位异或'^'操作符)

首先介绍操作符与位操作符的区别,位操作是程序设计中对位模式按位或二进制数的一元和二元操作。

在许多的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多。

有时候合理利用一个位操作符,可以帮助我们少些十几行代码。

移位操作符。

左移位操作符。

<<

将二进制序列左边抛弃,右边补0;
如:

int i=1;
00000000000000000000000000000001
i<<1;
00000000000000000000000000000010

右移位操作符。

>>

如同左移位操作符但又有不同。
如果该数为负数则右边抛弃,左边补1。
如果该数为正数则右边抛弃,左边补0。

接下来的按位操作符放一起讲。
按位与“&”:俩个二进制序列同一位上都是1则为1,其余为零。
按位或"|":俩个二进制序列同一位上有1则为1,其余为零。
按位异或“^”:俩个二进制序列同一位上都是1则为零。

知道安位操作符的性质,我们不妨写一些代码来看看他们具体有什么作用。

1. 不允许创建临时变量,交换两个整数的内容

#define _CRT_SECURE_NO_WARINGS 1
#include <stdio.h>
int main()
{
	int a = 3;
	int b = 5;
	a = a + b;//方法一
	b = a - b;
	a = a - b;
	printf("a=%d b=%d\n", a, b);
	a = 3;
	b = 5;
	a = a^b;//方法二,按位异或,该方法执行效率更好
	b = a^b;
	a = a^b;
	printf("a=%d b=%d\n", a, b);
	return 0;
}

运行结果:
在这里插入图片描述
2. 写一个函数返回参数二进制中 1 的个数。
例如: 15 0000 1111 4 个 1

#include<stdio.h>
int sum_bit_1(unsigned int n);//方法一
int sum_bit_2(unsigned int n);//方法二
int sum_bit_3(unsigned int n);//方法三
int main()
{
	int n = 0;
	int ret1 = 0;
	int ret2 = 0;
	int ret3 = 0;
	printf("输入要求的数\n");
	scanf_s("%d", &n);
	 ret1=sum_bit_1(n);//接受返回来的1的个数
	 ret2=sum_bit_2(n);
	 ret3=sum_bit_3(n);
	printf("ret1=%d\n", ret1);
	printf("ret2=%d\n", ret2);
	printf("ret3=%d\n", ret3);
	return 0;
}
int sum_bit_1(unsigned int n)
{
	int count = 0;
	while (n)//只要是非零就可进入循环
	{
		if (n % 2 == 1)
			count++;
		n = n / 2;
	}
	return count;
}
int sum_bit_2(unsigned int n)
{
	int count = 0;
	int i = 0;
	for (i = 0; i < 32;i++)//将32个比特位依次右移
	{
		if (((n >>i)& 1) == 1)//与1进行相与看不懂可自行写二进制序列
		{
			count++;
		}
	}
	return count;
}
int sum_bit_3(unsigned int n)
{
	int count = 0;
	while (n)
	{
		n=n&(n - 1);//按位与的非常有用的一个性质,与他本身小一相与一次其二进制序列数少一个1
		count++;
	}
	return count;
}

运行结果:
在这里插入图片描述
阅读代码可知,sum-bit_1用的是普通函数,sum_bit_2用的his移位操作符,sum_bit_3用的是按位异或操作符。

我们分析其时间复杂度和空间复杂度可知,一方法为n次,二方法为32次,三方法为二进制序列有多少个1执行多少次。所以方法三不管在时间复杂度还是空间复杂度都优于方法一和二。

4. 编程实现:
两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?

输入例子:

1999 2299

输出例子:7

#include<stdio.h>
int main()
{
	int n = 0;
	int m = 0;
	int i = 0;
	int count = 0;
	printf("输入俩个整数\n");
	scanf_s("%d%d", &m, &n);
	for (i = 0; i < 32; i++)
	{
		if (((m >> i) & 1) != ((n >> i) & 1))
			count++;
	}
	printf("不同比特位的数目为:%d\n", count);
	return 0;
}

运行结果:
在这里插入图片描述

发布了9 篇原创文章 · 获赞 16 · 访问量 2358

猜你喜欢

转载自blog.csdn.net/Shangxingya/article/details/104196398