gpt4 book ai didi

java - 了解负数上的 java BigInteger.bitCount 方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:16:15 26 4
gpt4 key购买 nike

此方法 BigInteger.bitCount() “返回此 BigInteger 的二进制补码表示中与其符号位不同的位数。”

如果数字是正数,就是数字中1位的个数。

我很难得到正确的负数。

例如,数字-1377605392的二进制表示是-1010010000111001001011100010000。它有 12 个 1 和 19 个 0。

但是 java 代码 BigInteger.valueOf((long)-1377605392) 给出的结果是 15!!

这个15是怎么算出来的?

最佳答案

二进制数的补码表示是指:

  • 减去 1
  • 将所有 1 切换为 0,将 0 切换为 1

将-1377605392的补码与对应的正数进行比较:

1111111111111111111111111111111110101101111000110110100011110000
0000000000000000000000000000000001010010000111001001011100010000

如您所见,所有位都被翻转,尾随零除外。

但是,在 BigInteger 中,负数存储为具有单独符号位的绝对(即:正)值,因此要计算负数中 0 的数量,粘贴的代码计算 1 中 1 的数量绝对值,加上尾随零的数量(仍然是 0)并减去 1(对于仍然存在的最后一个 1)

使用二进制补码的原因是它使基本算术变得非常简单,而且逻辑可以忽略符号。例如(为简单起见,使用 8 位数字):

 6 = 00000110
-2 = 11111110
4 = 00000100 (adding together with carry)

您应该在纸上用较小的数字做一些练习以了解其工作原理。

关于java - 了解负数上的 java BigInteger.bitCount 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34958822/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com