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

请考虑这个例子

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

有点位置和运算符是如何处理布尔变量的?

Java中的boolean没有按位运算。

&| 不要在Java中执行按位操作,而是执行逻辑操作(如JLS的第15.22.2节中所述) 。

  • &是逻辑AND(当且仅当两个参数都为true时才会计算为true
  • | 是逻辑OR(当且仅当至少有一个参数为true时才会计算为true )。

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

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

第一个: 是的 ,在某种程度上 ,两个操作将完全相同,除了它们的输入大小(由于优化,它们甚至可能是相同的)。

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

  • Java语言

    Java语言规范将boolean定义为具有两个值truefalse的基本类型 。 它没有为这些值定义数值,也没有直接的方法将其转换为数字类型,反之亦然(参见§4.2.2的最后一句)

  • Java虚拟机

    Java虚拟机规范 定义了boolean类型,但对它的支持很少。

    它还谈到转换

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

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

  • 硬件

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

对于布尔类型:

运算符&&&被视为逻辑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 "":(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 "":(Z)V 19: putstatic #85; //Field FALSE:Ljava/lang/Boolean; 

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

如果您将false <=> 0true <=> 1映射,则可以看到&|intboolean工作方式相同

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

如果你的表达中有一个代价高昂的方法,则最相关。

您执行的第一个操作 – TRUE&FALSE取为1和0,这是错误的。

第二操作–11和5被视为1011和0101(二进制值),当为anded时为0001。