简单的介绍下位运算符和实际项目中的运用
位运算是指进行二进制的计算,计算机内部的数据都以二进制的形式存在 所以位运算的效率比其他数学运算高的多。
位运算符的优先级
~的优先级最高,其次是<<、>>和>>>,再次是&,然后是^,优先级最低的是|。
|:按位或 两个相应的二进制中只要有一个为1,该位的结果就为1.
如:十进制数1和2的或运算 1个字节是8位 在java中int是4个字节就是32位 下面的我只写出了低位 高位全部是0就不写了
1的二进制是0000 0001
2的二进制是0000 0010
0000 0001
(|) 0000 0010
--------------------------------
0000 0011
最后的结果是3.
&:按位于 两个相应的二进制中都为1 改位的结果才是1,否则为0
2的二进制是0000 0010
3的二进制是0000 0011
0000 0010
(&) 0000 0011
--------------------------------
0000 0010
最后的结果是2.
~:按位取反 1变0 0变1
2的二进制是0000 0010
0000 0010
(~)
--------------------------------
1111 1101 (高位的0也变成了1)
最后的结果是-3
^:按位异或 两个同号则是0 否则为1
两个1为0
两个0为0
其他情况为1
2的二进制是0000 0010
3的二进制是0000 0011
0000 0010
(&) 0000 0011
--------------------------------
0000 0001
注意的是~运算符优先级是最高的。
项目应用
/**
* 类说明:物品类
*
* @version 1.0
* @author icetiger
*/
public class Prop
{
/**
* 限制类型 NO_TRADE=1 不可交易,NO_DESTROY=2 不可销毁,NO_SALE=4 不可出售,
* NO_WASTE=8不可使用消耗,LOCK_PROP=16锁定物品
*/
public static final int NO_TRADE=1,NO_DESTROY=2,NO_SALE=4,NO_WASTE=8,
LOCK_PROP=16;
int bindValue;
/** 判断是否使用受限制,传入限制类型,返回ture则表示不能进行此类型操作 */
public boolean checkBindLimit(int type)
{
return (this.bindValue&type)!=0;
}
/** 添加绑定值 */
public void addBindValue(int bindValue)
{
this.bindValue|=bindValue;
}
/** 移除绑定值 */
public void removeBindValue(int bindValue)
{
this.bindValue^=bindValue;
}
}
以上是物品类的相关代码定义了6种常量分别代表6种状态值 这里的int必须是2的N次方 N>=0.(后面有说)
有个域bindValue表示此物品的绑定值初始为0
在游戏中如果此时我们获得了一件装备prop 这件装备是穿戴绑定的 意思是穿戴了以后就不能交易了
这时候我们会调用addBindValue方法传入NO_TRADE这个常量表示这件装备不能被交易
0000 0000
(|) 0000 0001
-------------------------
0000 0001
计算之后bindValue的值是1
交易的时候自然会调用checkBindLimit这个方法 传入NO_TRADE
0000 0001
(&) 0000 0001
-------------------------
0000 0001
计算后为1不等于0返回true表示这件装备不能交易。
当然这个时候如果我们想要出售给商店会传入NO_SALE
0000 0001
(&) 0000 0100
------------------------------
0000 0000计算后是0 返回false 可以出售给商店
如果让它也不能出售给商店 我们可以再调用一次addBindValue方法传入NO_SALE
0000 0001
(|) 0000 0100
-------------------------
0000 0101
完成后想要再出售给商店就无法通过判断了0000 0101
(&) 0000 0100
------------------------------
0000 0100计算后不是0 返回true 不能出售给商店如果我们使用了一样道具 可以给装备解除交易绑定 使其可以交易
我们就调用removeBindValue方法 传入NO_TRADE这个状态值
0000 0101
(^) 0000 0001
------------------------------
0000 0100相当于把不能交易的这个状态值 移除了 就可以进行交易了
注意的是这里的常量值必须是2的N次方 N>=0 而且不能重复
为什么呢?我说出我的理解 欢迎大家讨论
二进制数0000 0000
2的N次方刚好占据一个位 值为1 其他位都是0 而且N不同占据的位置也不同
0000 0001 0次方
0000 0010 1次方
0000 0100 2次方
0000 1000 3次方
0001 0000 4次方
.........
在我们进行与操作的时候相当于把某个状态值 赋给bindValue使其拥有这个状态
按照|运算 这里可以理解为简单的相加如1|2=3,3|4=7,1|4=5
那么就相当于给予bindvalue的状态值
比如1|4
0000 0001
(|) 0000 0100
------------------------------
0000 0101
值是5.
在进行检查的时候执行的是&运算 相当于检查bindValue是否有这个状态值 有的话就不等于0 否则是0
比如检查是否可以出售物品NO_SALE=4 5&4
0000 0101
(&) 0000 0100
------------------------------
0000 0100
结果返回4这个状态值^运算操作刚好是把此状态值移除掉
比如移除不能出售物品的状态值
0000 0101
(^) 0000 0100
------------------------------
0000 0001
结果就只剩下不能交易的状态值了因为计算的特性所以常量值必须是2的N次方
另外&~的操作也可以移除一个状态值
期待高手解说 上面也写的头大了 也不知道好理解不····
刚开始写博客还望大家体谅 体谅 。
有时间我会继续写下去·
最后,晚安。睡觉了