Java位操作符的一种简单应用

点击量:246

几乎每种语言都会有位操作符,左移右移、“与”“非”、“或”、“异或”等,这些操作符的意义大家肯定都知道,但是你可曾想过这些位操作符有什么实际的使用价值吗?今天来说下位操作符的一种简单应用。

在游戏开发工作中最常遇到的是对玩家状态的记录,比如奖励是否已经领取过,页面是否是否打开过等等。如果有连续的状态需要记录则他的形式大致是这样的:0100011,0表示没有,1表示有。最常见的做法是DB里使用一个varchar字段用来存储这样的状态:0100011。每次变更的时候找到那一位的状态,然后改下就好了,很直观。但其实我们也可以使用int类型来存储这种连续的状态,一个整数怎么能表示那么多的状态呢?答案是把十进制整数转换为二进制,然后通过位操作符去变更每一位二进制的状态。

问题:给定一个整数a,我们要改变她所表示的二进制的第n位的值为1。

首先构造一个特殊的二进制数,这个数第n位为1,其余都是0。代码表示就是:

int base= (int)Math.pow(2, n-1);

那如果我要改变第n位的值为1,只要将a|base即可。因为base的第n位是1,而其他位都是0,所以“或”之后第n位只能是1,而其他位不受影响。

那如果要判断第n位的状态是不是1该如何做呢?答案是只要判断a&base == base或者a&base == 0即可(a&base==0表示第n位的状态为0,a&base == base则表示第n为的状态为1)。

这两种方式各有优缺点:

字符串这种方式操作简单,表意清晰,便于理解。

整数这种方式效率上要高点,但是不够直观,一旦数据出问题需要修复的时候就很麻烦了,要在SQL语句对这个数据进行转换和修复。(补偿的话这两种方式好像也差不多)

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注