当前位置: 首页 > 知识库问答 >
问题:

Java移位操作实现背后的逻辑

曾嘉福
2023-03-14

根据《联合法律法规》第15.19条:

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

我们可以在C#中找到同样的东西。在Python中,它将是6位而不是5位,但逻辑保持不变。

背后的理由是什么?对我来说,有以下内容会更自然:

x << 32 = 0 
x << 32 = x

共有1个答案

鲁鸿朗
2023-03-14

出自Joshua Bloch和Neal Gafter的《爪哇迷惑者:陷阱、陷阱和角落案例》一书:

语言设计者也许应该考虑将移位距离限制在0到类型大小的范围内,并更改按类型大小移位值以返回0的语义。虽然这可以避免混乱…,但它可能会产生负面的性能后果;Java对移位操作符的语义是许多处理器上移位指令的语义。

 类似资料:
  • Java Integer类具有静态方法highestOneBit方法,该方法将返回一个单个一位的值,该值位于指定值中最高一位的位置,如果指定值本身等于零,则返回零。 例如,int 17的输入将返回16;因为17可以用二进制表示为10001,所以它将返回等于16的最左边的位。 在整数类中,它在Java文档中具有以下实现。 我只想知道以这种方式实现它背后的逻辑以及使用 shift 操作背后的逻辑。谁能

  • 本文向大家介绍java<<、>>、>>>移位操作方法,包括了java<<、>>、>>>移位操作方法的使用技巧和注意事项,需要的朋友参考一下 <<,有符号左移位,将运算数的二进制整体左移指定位数,低位用0补齐。 以上是正整数,运算结果如下。 接下来看看将负数进行左移2位操作是什么情况,运算结果如下。 为什么会-10的二进制会出现这么多的1呢?仔细数一下刚好有32位。首先需要了解的是Java负数存储是

  • 问题内容: 在Java中,为什么-32 >>> -1 = 1? 它不仅限于-32。只要它们不是太大,它就适用于所有负数。 我发现 x >>> -1 = 1 x >>> -2 = 3 x >>> -3 = 7 x >>> -4 = 15 给出0> x>一些大的负数 -1与<< 1一样吗?但是-32 << 1 = -64。 我已经阅读了二进制补码,但仍然不明白其原因。 问题答案: 这是因为当您移位32

  • 问题内容: 据我了解,java将数据存储在二进制补码中,表示-1 = 11111111(根据Wikipedia)。 同样,从java docs中:“位模式由左侧操作数给出,要移位的位置数由右侧操作数给出。无符号的右移运算符“ >>>”将零移位到最左边位置,而“ ”之后的最左侧位置取决于符号扩展名。” 这意味着>>>每次都会将0移到最左侧。所以我希望这段代码是 迭代:x的位表示 0:11111111

  • 5.2.5 移位操作指令 移位操作指令是一组经常使用的指令,它包括算术移位、逻辑移位、双精度移位、循环移位和带进位的循环移位等五大类。 移位指令都有指定移动二进制位数的操作数,该操作数可以是立即数或CL的值。在8086中,该立即数只能为1,但在其后的CPU中,该立即数可以是1··31之内的数。 1、算术移位指令 算术移位指令有:算术左移SAL(ShiftAlgebraic Left)和算术右移SA

  • 问题内容: 我想知道是否有人可以详细解释 在以下哈希码实现中执行(由eclipse生成,但与有效Java相同): 谢谢! 问题答案: 基本上,它对long的高32位与低32位进行异或。这是分解版本: 回答您的评论:您有一个long值,必须将其转换为int才能作为哈希的一部分(结果必须仅为32位)。你打算怎么做?您 可以 只使用低32位-但这意味着 仅 高32位的更改将被忽略,这不会使其成为一个很好