什么是"|" 在"int style = SWT.APPLICATION_MODAL | SWT.OK;"中 做(以及如何谷歌)?

Del*_*ens 6 c c++ java operators bitwise-operators

我无法搜索| 在谷歌.如果你在一个你试图解释的软件源代码中找到它,你不知道它做了什么,你不能向其他人寻求帮助,你怎么知道它的作用?

J. *_*fer 30

在这种情况下,管道运算符意味着"使用SWT.APPLICATION_MODAL和SWT.OK作为弹出框的选项/标志." 这是一个非常常用的具有位域配置标识符的习惯用法,尤其是.在SWT或Win32等窗口系统中.

这个怎么运作

管道(|)运算符是按位OR运算符,也就是说,它计算两个二进制整数值的OR运算.如果你看看APPLICATION_MODAL和OK的定义,你会发现它们是这样的:

...
SWT.OK = 1,                  // 00000001 in binary
SWT.ABORT_RETRY_IGNORE = 2,  // 00000010 in binary
SWT.OK_CANCEL = 4;           // 00000100 in binary
...
SWT.APPLICATION_MODAL = 32;  // 00100000 in binary
... (and so on...)
Run Code Online (Sandbox Code Playgroud)

当您将两个(或更多)这些数字按位或按位时,将为每个选项设置单独的位:

int style = SWT.OK | SWT.APPLICATION_MODAL = 00000001 | 00100000 = 00100001
Run Code Online (Sandbox Code Playgroud)

用于解释样式的窗口工具包将能够通过执行按位AND来准确地分辨出您想要的内容(弹出框是Modal并具有"确定"按钮):

...
if(style & SWT.OK)
{
    // we want an OK box
}
if(style & SWT.ABORT_RETRY_IGNORE)
{
    // we want an Abort/Retry/Ignore box
}
if(style & SWT.OK_CANCEL)
{
    // we want an OK/Cancel box
}
...
if(style & SWT.APPLICATION_MODAL)
{
    // We want a modal box
}
...
Run Code Online (Sandbox Code Playgroud)

有点聪明,以我的拙见.它允许您在单个变量中选择/表示多个配置选项.诀窍在于选项的整数定义,并确保它们仅为2的幂.

  • 在Java中不常见,没有.您偶尔会在低级API中看到它,但我不会将其描述为常见的.更为"Java-ey"这样做的方式,至少从Java 5开始,就是将它们声明为枚举,然后使用类似EnumSet.of(SWTOptions.OK,SWTOptions.ApplicationModel)的东西(EnumSet实现为64-无论如何,在幕后,或者如果枚举中有超过64个元素,则只需要很长的数组 (3认同)

wei*_*iji 11

在回答你关于找出它的作用的问题时,我首先会告诉自己这是一个符号还是一个操作符.仅这一点就可以帮助我找出在Google中搜索的内容.正在使用的变量类型也给了我一个线索 - 它是一个运行int类型的运算符.

希望有所帮助.