gpt4 book ai didi

java - 为什么java方法Integer.toBinaryString(-128)输出七位数字?

转载 作者:搜寻专家 更新时间:2023-10-31 19:38:42 28 4
gpt4 key购买 nike

简单场景:你有一个字节数组

byte[] message = { 1, 2, 3 };

要以二进制形式打印出来,您可以使用代码:

for (byte b : message) {
System.out.println(Integer.toBinaryString(0x100 + b).substring(1));
}

(从 this stack overflow thread 得到代码)

并得到这个输出:

00000001
00000010
00000011



但是如果你在最后标记一个 -128...

byte[] message = { 1, 2, 3, -128 };

00000001
00000010
00000011
0000000

哇!七位二进制数?我觉得这与二进制补码有关,但我尝试阅读的越多,就越感到困惑。我原以为 10000000 会出现在第四行......

谁能用相对简单的术语解释为什么 -128Integer.toBinaryString 是七位数?


Ye olde javadoc表示 如果参数为负,则无符号整数值是参数加上 2^32;否则它等于参数。此值将转换为二进制(基数为 2)的 ASCII 数字字符串,没有额外的前导 0。但就像我说的......让我感到困惑。



整个事情的背景是我正在尝试用 java 编写一些 SHA 函数。别问我为什么,我也不知道……我只是好奇/挑战自己/挫败自己:)

根据 the documentation,用于 SHA-256 函数的消息填充(使其成为位长度 512 的倍数)是以下内容的串联:

  1. 原始消息
  2. 单个 1
  3. 0 位直到最后 64 位
  4. 作为 64 位值的原始消息长度

因为我的消息很可能是 ASCII 8 位代码,我只需要在 #2 中标记一个 10000000... 然后我可以计算 0 的数量 要添加的 BYTES,我不必为不是 8 的倍数的消息计划。问题是使 10000000

最佳答案

(-128 + 0x100) =
(256 - 128) = 128 =
0b10000000

Integer.toBinaryString(0b10000000) = "10000000"

"10000000".substring(1) = "0000000"

关于java - 为什么java方法Integer.toBinaryString(-128)输出七位数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23508860/

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