【问题标题】:Shifting a single nibble in Java BigInteger?在 Java BigInteger 中移动一个半字节?
【发布时间】:2012-06-21 06:19:33
【问题描述】:

我有一个包含两个字节的 Java BigInteger(例如:1000000100110111)。我只想将一个半字节,即左字节中最右边的半字节(下面以粗体显示)向左移动一位:

1000 0001 00110111

换档后的结果:

1000 0010 00110111

你有什么想法最好的方法吗?

谢谢, 克里斯

【问题讨论】:

  • @Shahzeb - 嗯,它们是 16 个 ,但不清楚最高有效位是否应该是符号位。因此,他可能无法将它们存储在 short 中,但他可以将它们存储在 int 中。

标签: java bit-manipulation bit-shift


【解决方案1】:

如果你只想移动一位,你应该清除旧的并设置新的:

bigint.clearBit(n-1)
      .setBit(n)

如果你想移动最左边四位旁边的那些,你可以将它们位映射出来,移动它们,然后或者它们回来:

bigint.and(0xf0ff).or(bigint.and(0x0f00).shiftLeft(1))

或者为了清楚起见:

unshifted = bigint.and(0xf0ff);
shifted = bigint.and(0x0f00).shiftLeft(1);
result = unshifted.or(shifted);

如果您不希望 1100 1111 变为 1101 1110(注意溢出),您可以在 or 之前再次将位图应用到移位的位置。

【讨论】:

  • 大概这只是一个例子。如果是0111呢?我认为他会想要 1110。
  • 对了,我只是提了一句,如果他知道位串非常稀疏,他可以节省一些操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 2023-03-17
  • 1970-01-01
  • 2018-09-10
相关资源
最近更新 更多