管道(|)运算符在设置某些属性时如何在Android中工作?

Ich*_*aki 6 java android operators

我的问题可能是基本的,但我想知道管道运算符如何在Android中的以下上下文中工作:

我们可以在布局中设置多个输入类型:

android:inputType = "textAutoCorrect|textAutoComplete"
Run Code Online (Sandbox Code Playgroud)

我们可以为intent设置多个标志,如下所示:

intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION|Intent.FLAG_ACTIVITY_CLEAR_TOP);
Run Code Online (Sandbox Code Playgroud)

我们还可以设置一些属性如下:

tvHide.setPaintFlags(tvHide.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Run Code Online (Sandbox Code Playgroud)

我们可以在多个实例中看到Android中的此类示例.

所以我的问题是,|操作符是否像按位OR运算符一样,或者它只是将结果或其他内容连接起来?
如果它的作用类似于按位OR运算符,那么它如何使预期结果正确?有人可以开导我这个吗?

Mic*_*odd 5

是的,这是一项bitwise inclusive OR操作,主要用于设置标志(文档)。考虑以下标志:

byte flagA = 0b00000001;
byte flagB = 0b00000100;
Run Code Online (Sandbox Code Playgroud)

如果使用|运算符,则将这两个标志组合在一起:

byte flags = flagA | flagB; // = 0b00000101
Run Code Online (Sandbox Code Playgroud)

这使我们可以在少量内存(通常是带有大多数Android标志的Integer)中设置属性或其他状态信息。

注意,一个标志应该只具有“有效”一位,即其值等于2 ^ n。当我们使用bitwise AND运算符检查组合的标志持有者变量时,这就是我们知道设置了哪些标志的方式

if ((flags & flagA) == flagA) {
    // Flag A has been set
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 唯一要添加的是,要使该机制起作用,标志必须为2的幂,因此位不会重叠。 (2认同)