最近在游戏项目中又有用bit值来表示状态的需求,比如在一个房间内,用一个byte表示四个位置的准备状态,或是四个位置的开闭状态。在房间开始游戏的时候需要判断是否所有的玩家都处于准备状态,此时即可以判断相应位置是否为1值即可。
对于这类开关状态的需求,可以实现的方法有很多,用一维数组存放状态、用二维数组存放位置和状态;或者用键值对存放位置和状态都可以。
但考虑到运算的快捷性以及运算结果发送至客户端的网络数据包大小,使用bit值的方法显然对于上面所述的方法有更大的优势。
关于位运算的
caozuofu.html" target="_blank">操作符的含义及计算原理这里就不详说了,下面这个文章说的很详细有不明白的可以看看。
http://blog.csdn.net/morewindows/article/details/7354571
下面的工具类提供了几个位运算相关的方法,代码用java写的,做项目的时候顺带翻译成了AS3,赶脚也没什么问题。
希望各位看官多多指正!
class="java">
/**
* Java 位运算的常用方法封装<br>
*
* @author Jian
* @date 2012-12-7
*
*/
public class BitUtils {
/**
* 获取运算数指定位置的值<br>
* 例如: 0000 1011 获取其第 0 位的值为 1, 第 2 位 的值为 0<br>
*
* @param source
* 需要运算的数
* @param pos
* 指定位置 (0<=pos<=7)
* @return 指定位置的值(0 or 1)
*/
public static byte getBitValue(byte source, int pos) {
return (byte) ((source >> pos) & 1);
}
/**
* 将运算数指定位置的值置为指定值<br>
* 例: 0000 1011 需要更新为 0000 1111, 即第 2 位的值需要置为 1<br>
*
* @param source
* 需要运算的数
* @param pos
* 指定位置 (0<=pos<=7)
* @param value
* 只能取值为 0, 或 1, 所有大于0的值作为1处理, 所有小于0的值作为0处理
*
* @return 运算后的结果数
*/
public static byte setBitValue(byte source, int pos, byte value) {
byte mask = (byte) (1 << pos);
if (value > 0) {
source |= mask;
} else {
source &= (~mask);
}
return source;
}
/**
* 将运算数指定位置取反值<br>
* 例: 0000 1011 指定第 3 位取反, 结果为 0000 0011; 指定第2位取反, 结果为 0000 1111<br>
*
* @param source
*
* @param pos
* 指定位置 (0<=pos<=7)
*
* @return 运算后的结果数
*/
public static byte reverseBitValue(byte source, int pos) {
byte mask = (byte) (1 << pos);
return (byte) (source ^ mask);
}
/**
* 检查运算数的指定位置是否为1<br>
*
* @param source
* 需要运算的数
* @param pos
* 指定位置 (0<=pos<=7)
* @return true 表示指定位置值为1, false 表示指定位置值为 0
*/
public static boolean checkBitValue(byte source, int pos) {
source = (byte) (source >>> pos);
return (source & 1) == 1;
}
/**
* 入口函数做测试<br>
*
* @param args
*/
public static void main(String[] args) {
// 取十进制 11 (二级制 0000 1011) 为例子
byte source = 11;
// 取第2位值并输出, 结果应为 0000 1011
for (byte i = 7; i >= 0; i--) {
System.out.printf("%d ", getBitValue(source, i));
}
// 将第6位置为1并输出 , 结果为 75 (0100 1011)
System.out.println("\n" + setBitValue(source, 6, (byte) 1));
// 将第6位取反并输出, 结果应为75(0100 1011)
System.out.println(reverseBitValue(source, 6));
// 检查第6位是否为1,结果应为false
System.out.println(checkBitValue(source, 6));
// 输出为1的位, 结果应为 0 1 3
for (byte i = 0; i < 8; i++) {
if (checkBitValue(source, i)) {
System.out.printf("%d ", i);
}
}
}
}