在 Java 中旋转字节中的位

Rotating bits in a byte in Java

提问人:Pocket 提问时间:10/29/2023 更新时间:10/29/2023 访问量:52

问:

我正在尝试实现 SHA 3 规范中的right_encode。https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-185.pdf 在此处输入图像描述 我所询问的特定部分可以在这张图片中找到,它正在将一个 int 转换为一个字节。

我试图将其实现为 字节 b = (字节) n; 但是当我使用 1 作为 n 时,它会输出 0000 0001 这很好,但我想知道我将如何旋转字节中的位,以便它最终成为 1000 0000 因为在 NIST 文档中,它们将左位作为低阶位。

Java 操作 字节

评论

0赞 user207421 10/29/2023
b = (byte)((b >>> 1)|(b << 7));

答:

3赞 harold 10/29/2023 #1

在本文档所述的 SHA-3 的非常具体的上下文中:

在本文档中,位以 Courier New 字体表示。字节通常写成两个 ASCII 字符 0 到 9 和 A 到 F 中的十六进制数字,前面是 前缀“0x”。在二进制表示中,字节首先用低位写入,而 十六进制表示,字节先用高阶数字写入。例如,0x01 = 10000000 和 0x80 = 00000001。这些位排序约定遵循约定 在 FIPS 202 的第 B.1 节中建立。

这个位顺序有点不寻常(但显然是标准化的),与你在程序中表示值的方式无关,只是它们在文档中的写法。您不必(也不应该,因为这将是不必要的复杂性,并且可能会引入更多错误)在数字变量(例如字节、整数等)中“反向”存储位。出于调试目的,您可能希望以二进制形式打印字节,左侧是最低有效位,以便更轻松地将值与该文档中显示的值进行比较。

通常,当应用于字节的位时,这种类型的重新排序将被称为反转位,而术语旋转通常保留用于循环移位。打印左侧最低有效位的字节(或其他类型的整数)并不是真正的反转,因为从这个意义上说,位没有固有的顺序。