java - 我可以执行哪些位掩码操作?

标签 java bit-manipulation bitmask

我正在使用java SWT,它有一堆我可以使用的位标志和操作,但我对它们不熟悉。

为了更好地解释,我有一种风格

style = SWT.A | SWT.B

这基本上意味着具有 A 风格 B。我知道这是因为

A = 0001
B = 0100
A | B = 0101 (bitwise or)

但是我还没有玩过足够多的东西来知道我能做的所有事情,这就是我所知道的

style |= A; // style adds flag A
style &= ~B; // style removes flag B

我可以使用+0之类的东西吗?用于三元运算。

style ?= question ? "+ style A" : "as is, no change"

我想也许

style = question ? style | A : style;
style = question ? style & ~B : style;

但我不确定。

还有什么有用的吗?

最佳答案

还有异或。

异或(又名 XOR)简写为一个或另一个,但不是两者。因此,如果将 01 异或在一起,它将返回 1。否则为0。不要忘记这些按位运算符也可以对 boolean 值进行操作。

int A = 0b0001;
int B = 0b0100;
// A | B = 0101 (bitwise or)


style ^= A; // If off, turn on.  If on, turn off.

style = A|B; // 0101
style ^= A; // style now equals 0100
style ^= A; // style now equals 0101

您也可以与之交换。

int a = 23;
int b = 47;
a ^= b;
b ^= a;
a ^= b;

现在 a == 47 且 b == 23

最后,按位运算符还有另一种用途。消除 if 语句的短路。这是一个例子:

int a = 5;
int b = 8;

// here a is true, no need to evaluate second part, it is short circuited.
if (a == 5 || ++b == 7) {
   System.out.println(a + " " + b);
}
// but here the second part is evaluated and b is incremented.
if (a == 5 | ++b == 7) {
  System.out.println(a + " " + b);
}

我不记得每次都以这种方式使用它,这可能会导致很难找到程序中的错误。但这是一个功能。

关于java - 我可以执行哪些位掩码操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59037666/

相关文章:

google-chrome - Java Selenium findelement 未确认页面上的元素

java - 按位运算符代码

python - COCO .json 文件的注释中包含奇怪的分段值,如何转换这些值?

c - 使用 C 进行位掩码和位操作

java - 如何针对 xsd 验证 xml 并获取 *ALL* 错误?

java - 为什么我的角色无法移动?

java - 更好地理解线程构造竞争条件

java - 模 32 或 64 约简是什么?

c - C 中两个寄存器之间的移位

php - 为什么我应该在 PHP 中使用按位/位掩码?