文章目录
本博文摘录自王建伟的《C++新经典》
1.位运算简介
1)按位与运算符”&”
- 运算
全1才为1,否则为0
- 举例
38 & 22 = 6
100110
&
010110
2)按位或运算符 “|“”
- 运算
有1才为1
3)按位异或运算符“^”
- 运算
同为0或同为1才为1,其余为0
4)取反运算符“~”
- 运算
0变成1,1变成0
5)左移运算符“<<”
- 运算
左移相当于乘2
6)右移运算符“>>”
- 运算
右移一位,相当于除2
2.位运算的具体应用(例如玩家的日常任务是否完成)
- 业务场景
表示玩家日常任务,比如有10个日常任务,如何表示玩家完成
- 解决方案
用一个unsigned int task,4字节有32位字节表示就可以表示32个日常任务是否完成
- 代码
#define BIT(x) (1 << (x)) //带参数的宏定义,表示1向左移x位
enum EnumTask
{
ETask1 = BIT(0); //1 =1 1
ETask2 = BIT(1); //1 =2 10
ETask3 = BIT(2); //1 =4 100
ETask4 = BIT(3); //1 =8 1000
ETask5 = BIT(4); //1 =32 10000
ETask6 = BIT(5); //1 =64 10000
ETask7 = BIT(6); //1 =128 100000
ETask8 = BIT(7); //1 =256 1000000
ETask9 = BIT(8); //1 =512 10000000
ETask10 = BIT(9); //1 =1024 100000000
};
unsigned int task = 0; //初始化游戏状态为0
if(task & ETask7) //做过任务,对应位数为1
{
//任务做了
printf("任务已经做了!\n");
}
else
{
//任务还没做
printf("任务还没做!\n");
//现在去做任务7
task = task | ETask ;//有1则为1
}