繁体   English   中英

java 中的位运算符

[英]Bitwise operator in java

当我写

int x = 11<<12+12>>11;

并且 print x 编译器显示 45056 这很有意义,因为它就像11<<24>>11然后首先从左到右求解它是11 * 2^24 / 2^11

同样对于

int x = 1<<12+1>>12;

它显示 2^23。 但是当我写

int x = 1<<22+22>>1;

它显示 2048 是 2^11 而不是 2^41。 请纠正我哪里错了。

以下都是相等的

int x = 1<<22+22>> 1;
int x = (1<<(22+22))>>1
int x = 1<<44>>1
int x = 1<<12>>1
int x = 4096 >> 1
int x = 2048

当您将 int 移位N时,您将移位N的低5位。
当您将 long 移位N时,您将移位N的低6

Java 语言规范 - 位运算符中所述

第 15.19 节

如果左侧操作数的提升类型是 int,则只有右侧操作数的五个最低位用作移位距离。 就好像右手操作数受到按位逻辑与运算符 & (§15.22.1) 的影响,掩码值为 0x1f (0b11111)。 因此,实际使用的移位距离始终在 0 到 31 的范围内,包括 0 到 31。

如果左手操作数的提升类型是长的,那么只有右手操作数的六个最低位被用作移位距离。 就好像右手操作数经过位逻辑与运算符 & (§15.22.1) 与掩码值 0x3f (0b111111)。 因此,实际使用的移位距离总是在 0 到 63 的范围内,包括 0 到 63。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM