Java的BigInteger符号量如何工作

时间:2017-03-14 21:53:32

标签: reverse bit biginteger

请考虑以下代码:

int i = 1;
System.out.println("1 binary: " + Long.toBinaryString(i));
long ri = Long.reverse(i);
System.out.println("1 reverse bit decimal: " + ri);
System.out.println("1 reverse bit binary: "+ Long.toBinaryString(ri));
BigInteger bil = new BigInteger(1, Longs.toByteArray(ri));
System.out.println("1 Sign-Magnitude BigInteger toString: " + bil.toString());

输出结果为:

1 binary: 1
1 reverse bit decimal: -9223372036854775808
1 reverse bit binary: 1000000000000000000000000000000000000000000000000000000000000000
1 Sign-Magnitude BigInteger toString: 9223372036854775808

任何人都可以帮忙解释为什么“1 Sign-Magnitude BigInteger toString:”的值是9223372036854775808(2 ^ 63)?

1 个答案:

答案 0 :(得分:3)

要获取值的符号幅度,只需将其绝对值作为幅度并记住单独位(或字节)中的符号。

722的符号幅度表示只是:

sign = 0
magnitude = 722

-722的符号幅度很简单:

sign = 1
magnitude = 722

这也是BigInteger使用的内容。

您的代码反转一个值,这意味着,例如,8位值00000001(1)将更改为10000000(128或2 ^ 7)。这与反转不同, 00000001(1)进入11111110(254)。这就是的补充所做的。通常使用的二补码00000001(1)否定为11111111(255,即256 - 1)。你应该阅读two's complement,这需要一些了解。然而,符号幅度很容易理解(但并不总是非常实用 - 加法,减法对于有符号和无符号等不同 - 这就是为什么大多数处理器使用两个补码)

再次:符号幅度的工作原理如下:

sign = (n < 0)
magnitude = abs(n)