项目开发实践(一) 位运算和位运算的应用

简单的介绍下位运算符和实际项目中的运用 


位运算是指进行二进制的计算,计算机内部的数据都以二进制的形式存在 所以位运算的效率比其他数学运算高的多。


位运算符的优先级
~的优先级最高,其次是<<、>>和>>>,再次是&,然后是^,优先级最低的是|。


|:按位或 两个相应的二进制中只要有一个为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次方 

另外&~的操作也可以移除一个状态值

期待高手解说 上面也写的头大了 也不知道好理解不····

刚开始写博客还望大家体谅 体谅 。

有时间我会继续写下去·

最后,晚安。睡觉了 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值