简单位运算及游戏日常应用的位运算

文章目录

本博文摘录自王建伟的《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
}

上一篇:MyEclipse/Eclipse运行程序后console显示信息不全问题


下一篇:Java正则表达式 重复字符(串)问题