java - 代码如何工作 - 应用于样式时为 "SWT.MULTI | SWT.SINGLE"

标签 java swt operators

这是我看到一段时间的代码。 我想知道代码是如何工作的。

public static final int MULTI = 1 << 1;
public static final int SINGLE = 1 << 2;
public static final int READ_ONLY = 1 << 3;
SWT.MULTI | SWT.SINGLE | SWT.READ_ONLY

我深入到 TableViewer(Composite parent, int style) 的类实现中寻找答案,但没有找到太多。

我找到了这段代码,但不太明白

static int checkBits (int style, int int0, int int1, int int2, int int3, int int4, int int5) {
int mask = int0 | int1 | int2 | int3 | int4 | int5;
if ((style & mask) == 0) style |= int0;
if ((style & int0) != 0) style = (style & ~mask) | int0;
if ((style & int1) != 0) style = (style & ~mask) | int1;
if ((style & int2) != 0) style = (style & ~mask) | int2;
if ((style & int3) != 0) style = (style & ~mask) | int3;
if ((style & int4) != 0) style = (style & ~mask) | int4;
if ((style & int5) != 0) style = (style & ~mask) | int5;
return style;
}

最佳答案

将位打包在一起

让我们看一下这段代码。

public static final int MULTI = 1 << 1;
public static final int SINGLE = 1 << 2;
public static final int READ_ONLY = 1 << 3;

“<<”运算符表示将位向左移动。 “<<”运算符后的数字告诉我们要移动多少位。

因此,另一种编写代码的方法是。

public static final int MULTI = 2;
public static final int SINGLE = 4;
public static final int READ_ONLY = 8;

通过以这种方式定义标志,这些值可以通过“或”运算(“相加”)在一起并保存在一个字节或一个整数中。

SWT.MULTI | SWT.SINGLE

这就是说将两个值的位放在一起。但这意味着什么?

在这种情况下,由于我们将值定义为单个位,因此与添加值相同。

MULTI = 2
SINGLE = 4

因此,状态值为6(2 + 4)。

请记住,我们不是在添加。因为我们使用的是位,所以效果与我们添加的效果相同。

解包位

您发布的第二段代码基本上采用了我们提出的 6,并将其拆分回 2 和 4。它的工作原理是检查每一位,一次一个,看看它是否存在。

让我们来看一根线,看看它在做什么。

if ((style & int1) != 0) style = (style & ~mask) | int1;

int1 表示样式位之一。为了便于讨论,假设它是值为 2 的 MULTI。

第一部分(if 条件)测试该位是否设置为样式整数。

第二部分有点棘手。 (比特,明白了。非常微不足道。)

掩码的值在代码中给出。

int mask = int0 | int1 | int2 | int3 | int4 | int5;

这只是所有状态值的“或”运算。根据我们最初的 MULTI、SINGLE 和 READ_ONLY 示例,它为我们提供了 x'0E' 或 14 的掩码。在本次讨论的其余部分,我将使用十六进制。

存在状态位

现在,回到我们正在谈论的那行。

if ((style & int1) != 0) style = (style & ~mask) | int1;

style & int1 是一个 AND 操作。这意味着必须在 styleint1 中设置该位。 Style 是我们之前设置的 x'06' (2 + 4)。 int1 是 x'02'。当您对 x'06' 和 x'02' 进行 AND 运算时,您会得到 x'02',这使得 if true 的值成为可能。

~mask 将 x'0E' 转换为 x'F1'。换句话说,所有的位都从 0 翻转到 1,然后从 1 翻转到 0。

style & ~mask 是一个 AND 操作。当您对 x'06' 和 x'F1' 进行 AND 运算时,您将得到 x'00'。换句话说,所有位都不匹配。

前面我们说过int1是MULTI,取值为2或者x'02'。现在我们做一个 OR 操作,我们之前解释过。 ORing x'00' 和 x'02' 得到 x'02',这是我们想要提取的 MULTI 值。

状态位不存在

另一种选择(当状态位不存在时)会导致稍微不同的结果。我们没有设置 READ_ONLY,所以让我们进行计算。

READ_ONLY 是 x'08'。样式为 x'06' 当您在 if 中将这些值放在一起时

if ((style & int1) != 0) style = (style & ~mask) | int1;

您得到 x'00',这会导致 if 的值为 false

理由

将多个状态值放入一个字节或字中的最初原因是为了节省内存。这在 40 年前计算机内存有限时很重要。现在,这样做是为了方便传递状态。您传递一个状态指示器,而不是将 7 或 15 个不同的状态指示器从一种方法传递到另一种方法。

如您所见,权衡是需要一些代码来提取状态位以便您可以使用它们。

关于java - 代码如何工作 - 应用于样式时为 "SWT.MULTI | SWT.SINGLE",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14622516/

相关文章:

Python a &= b 是什么意思?

java - 如何让 Weblogic 8.1 提供静态内容?

java - #{facesContext} EL 表达式在运行时未解析

java - SWTBot - 等待消息框

java - SWT 程序.启动邮件客户端

java - SWT 浏览器内部链接不适用于 IE6

javascript - "|"(管道)运算符的功能是什么?

r - R 中的双冒号 (::) 是什么?

java - 构建具有不同列数的 html 表

java - 运行同一类但具有不同初始条件的测试套件