如何通过位运算符在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
)。
请注意, 相同的运算符用于按位运算 ,但这些运算符只适用于两个操作数都是可转换为整数类型的类型(即byte
, char
, short
, int
, long
及其各自的包装器)。
由于这篇文章引发了一些激烈的讨论,我想我会澄清我对“按位”和“逻辑”操作之间差异的坚持。
第一个: 是的 ,在某种程度上 ,两个操作将完全相同,除了它们的输入大小(由于优化,它们甚至可能是相同的)。
但是 ,这里至少有3个级别:
-
Java语言
Java语言规范将
boolean
定义为具有两个值true
和false
的基本类型 。 它没有为这些值定义数值,也没有直接的方法将其转换为数字类型,反之亦然(参见§4.2.2的最后一句) -
Java虚拟机
Java虚拟机规范 定义了
boolean
类型,但对它的支持很少。它还谈到转换
Java虚拟机使用1表示
boolean
数组元素以表示true,使用0表示false。 其中Java编程语言boolean
值由编译器映射到Java虚拟机类型int
,编译器必须使用相同的编码。在JVM中满足此要求的最简单方法显然是让
1
为true
,0
为假,让转换操作为无操作。 这也是最可能的实现,但它不一定是唯一正确的实现。 -
硬件
这种情况变化很大,但是大多数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_0
或0
用于false
如果您将false
<=> 0
和true
<=> 1
映射,则可以看到&
和|
对int
和boolean
工作方式相同
对于你的情况,我认为b / w &
和&&
的唯一区别在于,对于&
,即使第一个操作数的计算结果为false,第二个操作数仍将被计算,而在&&
的情况下,第二个操作数的计算结果未被评估如果第一个评估为false。
如果你的表达中有一个代价高昂的方法,则最相关。
您执行的第一个操作 – TRUE&FALSE取为1和0,这是错误的。
第二操作–11和5被视为1011和0101(二进制值),当为anded时为0001。