【问题标题】:Bitwise operator in javajava中的位运算符
【发布时间】:2021-05-14 09:32:32
【问题描述】:

我写的时候

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

并且 print x 编译器显示 45056 这是有道理的,因为它就像 11&lt;&lt;24&gt;&gt;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。请纠正我的错误。

【问题讨论】:

  • 我没有得到你得到的相同值。对于第一个示例,我得到90112,然后第二个示例得到2。在第三个示例中,我得到2048
  • 一个 int 有多少位? 32 - 你认为如何将 44 位向左移动 32 位值?事实上,Java 只看低 5 位,所以它向左移动 22 位,然后向右移动 1 位。

标签: java bit-manipulation operators


【解决方案1】:

以下都是相等的

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
当您将长移位 N 时,您将移位 N 的低位 6

Java Language Specification - bitwise operator中所述

第 15.19 节

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多