请考虑以下代码:
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)?
答案 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)