几乎每种语言都会有位操作符,左移右移、“与”“非”、“或”、“异或”等,这些操作符的意义大家肯定都知道,但是你可曾想过这些位操作符有什么实际的使用价值吗?今天来说下位操作符的一种简单应用。
在游戏开发工作中最常遇到的是对玩家状态的记录,比如奖励是否已经领取过,页面是否是否打开过等等。如果有连续的状态需要记录则他的形式大致是这样的: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,而其他[……]