本文节选自《LPC语言基础教程:从零学习游戏开发》,版权归@mudren,欢迎转载,但必须注明来源(mud.ren)。
位段(或称“位域”,Bit field)为一种数据结构,可以把数据以位的形式紧凑的储存,并允许程序员对此结构的位进行操作。在 LPC 语言中有几个和位运算相关的方法:set_bit(3), clear_bit(3), test_bit(3),但是在游戏开发中这些使用的很少了,但利用位运算来存储状态还是非常常用的。
比如:在游戏中开发迷宫,如何判断迷宫房间的方向是否是出口?我们看看一个房间的出口有多少种:

东、南、西、北四个方向出口组合一共有16种状态,我们可以声明16个变量来表示,但在写代码时可能会很麻烦。而巧用位运算,我们可以更轻松的实现相关功能:

如上图,我们做如下定义:
#define N 1<<0
#define E 1<<1
#define S 1<<2
#define W 1<<3
北、东、南、西分别是1、2、4、8,对应二进制0001、0010、0100、1000,在游戏开发中做位运算的时候,我关注的主要是某一位的值是0,还是1,而并不是去关注这个整数的值是多少。在这里第1位是1代表北方有出口,第2位为1代表东方有出口,第3位为1代表南方有出口,第4位为1代表西方有出口,而类似东北方向都有出口就是0011,四个方向都有出口就是1111。
当我们需要设置一个迷宫房间某个方向的出口时只需要使用按位或|运算设置对应位为1,而需要判断迷宫房间某个方向是否有出口时只需要用按位与&运算判断对应位是否为1即可。
// 初始化房间(没有任何出口)
int x = 0;
// 设置北方出口
x |= N;
// 设置东方出口
x |= E;
// 北方是否有出口
if (x & N)
{
// todo
}
关于&、|、~和<<等位运算符的使用如果不熟悉,可以回顾教程第三章第一节的内容。
附几个常用的位运算函数,用来做位运算检测。
//检查state的第pos位是否为1
int bitCheck(int state, int pos)
{
return state & (1 << (pos - 1));
}
//返回将state的第pos位的值设为1的值
int bitSet(int state, int pos)
{
return state | (1 << (pos - 1));
}
//返回将state的第pos位的值设为0的值
int bitClear(int state, int pos)
{
return state & (~(1 << (pos - 1)));
}
更新中...