我有 8 个物体,我们称之为“灯”。每个灯都可以打开或关闭(0 或 1)。每个灯都有一个索引 (0-7)。
我不熟悉Java中的按位运算,但我认为下面的代码检查灯是否正确打开或关闭:
int value = 128;
int index = light.getIndex();
boolean lightIsOn = (value >> (index & 0x1) == 1);
我目前面临无法打开所有灯的问题。例如,如果灯 0 亮,而我打开灯 1,则灯 1 会说它亮,但灯 0 会说它关。即使用以下代码:
if (!lightIsOn) {
value = (value | 1 << index);
}
我知道我设置不正确。我只是不知道该怎么做。这些东西并不能完全在我的大脑中计算。我已经阅读了所有按位运算符,但它对我来说仍然没有真正的意义。谁能向我解释一下我做错了什么?
最佳答案
你“开灯”的方法没问题。
您可能认为它已损坏,因为测试“灯”是否亮起的方式存在错误。让我们来分解一下:
boolean lightIsOn = (value >> (index & 0x1) == 1);
从最里面的括号开始,将 index
与 1 相交。如果索引为奇数,这会导致 value
移动一位,如果索引为偶数,则不执行任何操作.
然后将移位的结果与 1 进行比较。
如果 value
为 3 并且 index
为零,则会得到错误的 false
结果。如果 value
大于 3,则无论 index
为何,您都会得到 false
,这可能是错误的。
像这样的表达式将给出预期的结果:
boolean lightIsOn = ((value >>> index) & 1) == 1;
关于java - Java 中的位操作 - 根据位值有条件地切换位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60347743/