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 true和0false,让转换操作成为无操作.这也是最可能的实现,但它不一定是唯一正确的实现.
硬件
这种情况变化很大,但是大多数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 "<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_0或0用于false
如果映射false<=> 0和true<=> 1你可以看到,&并|为相同的方式工作int和boolean
| 归档时间: |
|
| 查看次数: |
8327 次 |
| 最近记录: |