使用" |"将多个参数传递给单个参数化方法?

时间:2014-03-21 03:25:13

标签: java

我做了一些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);
    }
}

我的问题是这里发生了什么?

2 个答案:

答案 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,左移,右移)。