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

Bha*_*dri 3 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
Run Code Online (Sandbox Code Playgroud)

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

Joa*_*uer 12

booleanJava 中没有按位操作.

&并且|不要在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虚拟机boolean使用1表示数组件,表示true,0表示false.如果编程boolean器将Java编程语言值映射到Java虚拟机类型的值int,则编译器必须使用相同的编码.

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

  • 硬件

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

  • **Java中的`boolean`没有按位运算**.就这么简单.上面的示例(`a&b`)中发生的事情是逻辑的,并且在JLS中指定(请参阅我的答案中的链接). (2认同)
  • @Trevor:我坚持这个的原因不是我的自我(这很好,谢谢;-)),但这是C(和一些基于C语言)的重要区别:`boolean`是一个键入它自己的权利而不仅仅是一个"非常小的整数".JLS以这种方式对待它,它可能有充分的理由这样做. (2认同)

Pet*_*rey 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;
Run Code Online (Sandbox Code Playgroud)

在这段代码中,它定义为TRUE new Boolean(true),你可以看到它true被推入堆栈使用iconst_1就像push(1)类似iconst_00用于false

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

  • 你是我的英雄. (2认同)