java - Java 中的位操作 - 根据位值有条件地切换位?

标签 java bit-manipulation operator-keyword

我有 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/

相关文章:

java - 我不能在 Java 11 中使用 @PostConstruct 和 @PostDestroy

c - 关闭 ARM9 (LPC3141) 上的单个 GPIO 引脚

rust - 你如何在 Rust 中设置、清除和切换单个位?

c++ - 在 C++ 中向多态树添加功能

c++ - 重载有理数类的 istream >> 运算符。不知道如何处理整数

java - 使用 JSTL/Tomcat 进行财务计算的最佳实践

java - 无法找到或加载主类 com.android.sdkmanager.Main

java - Spring ORM 4.0.5 和 Hibernate 4.3.5 - 无法保存到数据库

C++ 移位方式

java - 为什么 -2>>>1 在 Java 中等于 2147483647