java - Java 中的位移位

标签 java bit-manipulation

为什么会这样:

return 1 | (1 << 32) // returns 0x00000001

但是:

return 6 | (1 << 32) // returns 0x00000007

我期待后者返回 0x00000006。什么类型的位掩码可以与表达式进行“或”运算以生成 6 | 0x00000006 (1 << 32)?

最佳答案

Java 在移位时仅使用位移参数的最后 5 位 int s。所以1 << 32相当于 1 << 0 ,或者只是1 .

1位已在 1 中设置,所以1 | 11 。为了清楚起见,仅显示最后 8 位:

   0000 0001 (1)
or 0000 0001 (1)
------------
   0000 0001 (1)

但是1 6 中未设置位,所以6 | 1设置该位,数字变为 7 。它正在按预期工作。

   0000 0110 (6)
or 0000 0001 (1)
------------
   0000 0111 (7)

添加

针对问题的补充:

6仅设置了 2 位 ( 0000 0110 ),因此您可以与 6 进行按位或运算的任何数字并且仍然有 6必须清除 6 中清除的所有位。只剩下 4 个选择,即 6 的设置位的组合。正在设置或清除:

  • 0 (0000 0000)
  • 2 (0000 0010)
  • 4 (0000 0100)
  • 6 (0000 0110)

任何其他int将设置至少一个其他位,使输出不同于 6 .

关于java - Java 中的位移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26431832/

相关文章:

Java 如何将 String 存储/表示为 long。然后从 long 到 String

c - K&R 练习 2-7,优化?

Delphi编程将66位值(十六进制)转换为十进制

具有可变位数的 Swift 符号扩展

java - 如何创建具有多种布局样式的布局

java - Constructor.newInstance 与 Class.newInstance 与 SecurityManager

java - Axis2 Web 服务和 Eclipse WSDL 创作 : Adding an axis fault to wsdl causes exception when running wsdl2java

java垃圾收集执行<(主要收集:mark and sweep> every time it does a <minor collection:scavenge>

java - 如何设计一个 DAO 类?

计算任何数据类型的奇数位的 C 宏