我做了一些android的东西,发现了奇怪的java代码片段。
我用j2se检查了以下内容并给出了评论结果(没有“打印”)。
Java代码段如下所示:
class A{
public static void main(String[] args) {
method(1 | 2); //prints 3
method(1 | 2 | 3); //prints 3
method(1 | 2 | 3 | 4);//prints 7
}
public static void method(int value) {
System.out.println(value);
}
}
我的问题是这里发生了什么?
答案 0 :(得分:3)
按位OR
1 | 2 = '01' | '10' = 11 = 3
1 | 2 | 3 = '01' | '10' | '11' = 11 = 3
1 | 2 | 3 | 4 = '01' | '10' | '11' | '100' = 111 = 7
答案 1 :(得分:1)
|
是一个按位OR运算符。
它正在对数值应用OR。更容易看到二进制文件:
1 | 2 | 3 | 4
1 is 0...00000001
2 is 0...00000010
3 is 0...00000011
4 is 0...00000100
OR: 0...00000111 bitwise OR of all values
0...00000111 = 7
它没有传递“多个值”,它是一个计算单个值的算术表达式。
然而,它经常用于通过例如一组“布尔”标志,其中每个标志由一个位表示。例如:
static final int FLAG_CRISPY = 1; // 00000001 binary
static final int FLAG_SMOKED = 2; // 00000010 binary
static final int FLAG_ENDLESS = 4; // 00000100 binary
然后你可能有一个方法:
void makeBacon (int flags) {
if ((flags & FLAG_CRISPY) != 0) // bitwise AND to check for flag
... flag is set
if ((flags & FLAG_SMOKED) != 0) // bitwise AND to check for flag
... flag is set
if ((flags & FLAG_ENDLESS) != 0) // bitwise AND to check for flag
... flag is set
}
你可以这样称呼:
makeBacon(FLAG_SMOKED | FLAG_ENDLESS);
定义这样的标志很方便,因为您可以随着程序的发展修改标志集,而无需对方法接口进行任何更改。能够在单个int
中封装大量选项(例如,将数据存储到二进制文件或通过网络发送时)也是有用的。
official tutorial on bitwise and bit-shift operators有关于其他相关运算符的更多信息(例如AND,XOR,左移,右移)。