【问题标题】:Java unsigned bitshift on BigInteger [duplicate]BigInteger上的Java无符号位移[重复]
【发布时间】:2017-10-19 13:18:12
【问题描述】:

我正在尝试在右侧应用无符号移位,但找不到方法。有谁知道吗?

示例代码:

BigInteger bi;

bi.shiftRight(7) // equals >> 7

如何申请>>> 7

重复?请大神,我没有答案。

【问题讨论】:

  • 这样的运算符对 BigInteger 没有意义;您能否扩展您的问题以添加您想要使用此类运算符的内容,并给出一些预期输出的示例?
  • @DodgyCodeException:我也这么认为,但为什么不呢?正数可以像正常一样移动,但负数应该变成正数并被否定。 IOW,向右移动 4,0x87654321(负)将变为 0x08765432(正)。 BigIntegers 也可以模拟。
  • @RudyVelthuis “BigIntegers 也可以模拟。” - 如何?您作为示例显示的是位移 positive 数字。 -0x876543221 是负数,但 0x87654321 是正数。仅当存储为 32 位二进制补码时才被视为负数。但是,例如,如果它是 64 位长,则它不是负数。 BigIntegers 不是 32 位的,它们不是 64 位的,它们是“无限位”长的。所以对于 BigInteger,0xWhatever 总是正数。
  • 我想知道那些将这个问题标记为重复的人是否真正正确地阅读这个问题?另一个问题没有回答这个问题。这个问题可能会有所帮助:stackoverflow.com/questions/34753668/…

标签: java biginteger


【解决方案1】:

正如BigInteger javadocs 所说:

无符号右移运算符 (>>>) 被省略,因为此操作与此类提供的“无限字长”抽象结合起来毫无意义。

【讨论】:

  • 那你能提供一个替代方案吗?
【解决方案2】:

如果它是否定的,你总是可以否定的。

private void test(String[] args) {
    test(BigInteger.ONE.shiftLeft(10));
    test(BigInteger.valueOf(-50));
}

private void test(BigInteger bigInteger) {
    test1(bigInteger);
    test1(bigInteger.negate());
}

private void test1(BigInteger bi) {
    System.out.println(bi.toString(2)+" >> 5 = "+bi.shiftRight(5).toString(2));
}

注意:请记住,BigInteger不可变的,因此如果对它们进行数学运算,则必须保留返回的结果,因为数学运算不会修改值,它会返回计算结果。

【讨论】:

    【解决方案3】:

    我建议也许使用一种 unsigned int int 类型,以便允许使用您希望使用的运算符并确保数据只是无符号的。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2010-10-20
    • 1970-01-01
    相关资源
    最近更新 更多