当前位置: 首页 > 面试题库 >

java位操作>>> shift

杭曦
2023-03-14
问题内容

为什么要

int x = -1 // binary: 11111111111111111111111111111111
x = x >>> 31;

我们有00000000000000000000000000000000000001

但是如果

int x = -1
x = x >>> 32;

我们有11111111111111111111111111111111(-1)

但不是00000000000000000000000000000000000000?


问题答案:

从JLS的15.19节开始:

如果左侧操作数的提升类型为int,则仅 将右侧操作数的最低5位用作移位距离
。就像右侧操作数受到&掩码值的按位逻辑AND运算符(第15.22.1节)一样0x1f (0b11111)。因此,实际使用的移位距离始终在范围内0 to 31,包括端点。

强调我的。所以:

x >>> n

等效于:

x >>> n & 0x1f  // or x >>> n % 32

因此,x >>> 32等效于x >>> 32 & 0x1f<==> x >>> 0== x

因此,根据经验 法则 ,每当将数字乘以32int is 32 bits)的倍数时,您都将获得相同的值。



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

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

  • 这个代码的大O是什么?我知道除了递归部分,所有的线都是O(1)。我不确定递归的大O是什么,我有一种感觉,它仍然是O(1),因为我们没有比O(1)更差的线,但通常递归是O(n)。 代码: 编辑:顺便说一句,这不是家庭作业,而是为面试做准备。

  • 通过np.bitwise_and()函数对输入数组中的整数的二进制表示的相应位执行位与运算。 例子 输出如下: 13 和 17 的二进制形式: 0b1101 0b10001 13 和 17 的位与: 1 你可以使用下表验证此输出。 考虑下面的位与真值表。 通过np.bitwise_or()函数对输入数组中的整数的二进制表示的相应位执行位或运算。 import numpy as np a,b = 1

  • 求子集[M]

  • 我目前正在处理Java 8中使用Lambdas进行按位操作的循环转换问题。 给定一组复杂的条目,循环需要遍历所有条目并对它们调用给定的方法(方法返回布尔值)。之后,返回结果。 谢谢!