本文是作者这段时间学习位运算的总结,部分内容学习自小甲鱼,我加以总结。本文是对位运算应用整理。
一.不使用中间变量,交换两整数x,y的值,程序如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned x,y;
printf("输入x,y:");
scanf("%u %u",&x,&y);
x=x^y;
y=y^x;
x=x^y;
printf("x=%u y=%u",x,y);
return 0;
}
二.利用位运算符实现功能
这里要插入一段关于掩码的概念
掩码
在计算机学科和数字逻辑中指的是一串二进制的数字通过与目标数字按位操作来达到屏蔽指定位的需求而实现的
1.判断
总 客厅 餐厅 厨房 主卧 次卧 次卧 书房
1 1 0 0 1 0 0 0
现在配电箱状态如上图所示
如果现在要判断主卧是否开启,我们可以设置一个掩码
掩码
1 0 0 0 1 0 0 0
我们现在关注的是主卧的情况,但我们的总电源必须开着
所以我们将主卧和总电源都设置为一,然后进行与&操作,得到下表
结果
1 0 0 0 1 0 0 0
我们现在只需判断,结果的值是否等于掩码的值(136),就可以知道主卧的状态,因为不管谁&0都会变成0
if((value&mask)==mask)
{
printf(“OPEN!\n”);
}
作用二:打开位
有时候必须要求特定的位必须是打开状态,其他为保持不变,我们可以利用按位或运算符来实现打开某个位
例:我们现在要确保主卧是打开状态
总 客厅 餐厅 厨房 主卧 次卧 次卧 书房
1 1 0 0 0 0 0 0
设置掩码,我们要求主卧和总开关都打开,所以都设置为1,其他都设置为0
掩码
1 0 0 0 1 0 0 0
两个表进行或运算,因为任何一个数与0进行或|运算都是它本身,所以不变
任何一个数与1进行或运算都是1
作用三:关闭位
做法:将掩码取反,并与目标值进行按位与的操作
总 客厅 餐厅 厨房 主卧 次卧 次卧 书房
1 1 0 0 1 0 0 0
掩码
1 0 1 1 1 1 1 1
结果
1 0 0 0 1 0 0 0
作用四:转置位
转置一个位就是将一个二进制为取反
要转置一个或者多个二进制位,我们可以采取异或的操作
总 客厅 餐厅 厨房 主卧 次卧 次卧 书房
1 1 0 0 0 0 0 0
现在我们要对客厅和主卧取反,我们只需要将掩码设置为客厅1,主卧1,然后用异或运算符进行转置
掩码
0 1 0 0 1 0 0 0
结果
1 1 0 0 1 0 0 0