首先介绍操作符与位操作符的区别,位操作是程序设计中对位模式按位或二进制数的一元和二元操作。
在许多的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多。
有时候合理利用一个位操作符,可以帮助我们少些十几行代码。
移位操作符。
左移位操作符。
<<
将二进制序列左边抛弃,右边补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;
}
运行结果: