java 位运算问题

sC_Cs 发布于 2014/07/07 18:26
阅读 288
收藏 2

小弟有个位运算的问题请教,场景如下:

有一些表示状态的值在java里经常用int值来表示,这样可以给一个字段设置多个状态,例如android中

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
在判断这个字段的时候,我们可以用&运算符来进行判断这个字段是否包含某一个值

int a=3; int b=9; System.out.println((a|b));//标志位的集合 System.out.println((a|b)&b);//这里值=9
如上代码,只要一个数与b进行或操作后再与操作。结果值永远是b,通过这样可以判断字段中是否包括某个状态值。

好了。现在问题来咯。我用什么操作,能在总值里剔除掉b呢。之前我想的是总值&要剔除的值的非。即:

(a|b)&(~b)
这样在理论上是可以的,但是在java中,~b会把第一位符号位也进行操作,这样值就乱套了。所以想问问大神,在java中,怎么用位运算剔除总值里的某一个数:

加载中
0
p
polaris_chen

如果a和b都是正数,那么其实使用  a&~b 就可以剔除b了。

如果a是负数,或者b是负数,计算机使用补码来表示负数,补码的计算不能简单使用"非"。这个有点难搞。我觉得是不是可以有其他方法,而不一定要用按位计算。

有意思的题目,坐等高人解答。

0
吴笑笑
个人意见,总值中的位是不能简单用位消去的,因为总值中的任意一个位可能存储了对多个标志的信息,直接对总值中某一个1位的消去会影响其他标志的信息。如果要剔除掉总值中某一个标志的信息必须要知道哪些标志改动了这个位,如果只有当前需要消除的标志改动过该位时才允许修改位(不知道对不对楼主问的意思)
0
Timco
Timco

我觉得对于这种与运算的状态叠加,其各种状态的值必然是2^n。这是先决条件。这样它们对应的2进制只有1位是1.

在这个条件下a|b才是它们的和。3|9明显不等于12.

解决办法就是 

(a|b)&(b^Integer.MAX_VALUE)

ps:即使~b没有算上符号位的话,(3|9)&(~9)也是不等于3的。

请设置为最佳 P-)



0
obaniu
obaniu

屏蔽掉最高位:(a|b)& ((~b)& 0x7FFFFFFF)

参考博文java中2个int合并成一个long

返回顶部
顶部