如何通过位运算符在java中处理布尔值

时间:2011-05-06 11:57:27

标签: java bitwise-operators

请考虑这个例子

int i=11, j=5;
boolean b=true, c=false;
System.out.println(b&c); // --> output=false
System.out.println(i&j); // --> output=1

如何逐位运算并处理布尔变量?

4 个答案:

答案 0 :(得分:12)

Java中boolean没有按位操作。

&|不在Java中执行按位操作,而是logical operations (as specified in §15.22.2 of the JLS)

  • &是逻辑AND(当且仅当两个参数均为true时才会评估为true
  • |是逻辑OR(当且仅当至少有一个参数为true时,它将评估为true

请注意,相同的运算符用于bitwise operations,但这些运算符只适用于两个操作数都属于可转换为整数类型的类型(即bytecharshortintlong及其各自的包装。)

由于这篇文章引发了一些......激烈的讨论,我想我会澄清我对“按位”和“逻辑”操作之间差异的坚持。

第一个:,在某些级别,这两个操作将完全相同,除了输入的大小(可能甚至相同,到期)优化)。

但是,这里至少有3个级别:

  • Java语言

    The Java language specificationboolean定义为a primitive type with the two values true and false。它确实为这些值定义数值,并且没有直接的方法将其转换为数字类型,反之亦然(参见§4.2.2的最后一句)

  • Java虚拟机

    The Java Virtual Machine Specification defines the boolean type但对它的支持很少。

    它还说明了有关转化的信息

      

    Java虚拟机使用1表示boolean数组组件以表示true,使用0表示false。编译器将Java编程语言boolean值映射到Java虚拟机类型int的值时,编译器必须使用相同的编码。

    在JVM中满足此要求的最简单方法显然是让1true0为false并让转换操作为无操作。这也是最可能的实现,但它不是必然唯一正确的实现。

  • 硬件

    这种情况变化很大,但是大多数CPU都不支持boolean类型(为什么要这样做?)因此boolean上的操作将使用正常的按位操作。

    < / LI>

答案 1 :(得分:9)

对于布尔类型:

运算符&&&被视为逻辑AND

运算符|||被视为逻辑OR。

您还有执行XOR的^和执行NOT的!


这如何在JVM中工作?它与逐位整数运算相比如何?

在字节代码级别,FALSE的值为0,TRUE的值为。来自javap -c java.lang.Boolean

static {};
  Code:
   0:   new     #56; //class java/lang/Boolean
   3:   dup
   4:   iconst_1
   5:   invokespecial   #89; //Method "<init>":(Z)V
   8:   putstatic       #86; //Field TRUE:Ljava/lang/Boolean;
   11:  new     #56; //class java/lang/Boolean
   14:  dup
   15:  iconst_0
   16:  invokespecial   #89; //Method "<init>":(Z)V
   19:  putstatic       #85; //Field FALSE:Ljava/lang/Boolean;

在此代码中,它将TRUE定义为new Boolean(true),您可以看到使用trueiconst_1推入堆栈,类似于push(1)同样iconst_00用于false

如果您映射false&lt; =&gt; 0true&lt; =&gt; 1您可以看到&|intboolean

的工作方式相同

答案 2 :(得分:2)

对于您的情况,我认为b / w &&&的唯一区别在于&,即使第一个操作数计算,第二个操作数仍将被评估为false,而在&&的情况下,如果第一个操作数的计算结果为false,则不计算第二个操作数。

如果你的表达方法成本很高,那么最相关。

答案 3 :(得分:0)

你做的第一个操作 - 真实&amp; FALSE被视为1&amp; 0,这是假的。

第二次手术 - 11&amp; 5被视为1011&amp; 0101(二进制值),当为anded时为0001。