java - 位移位 - 为什么此代码使用 24、16 和 8 右移?

标签 java bit-shift

我正在查看这段java代码并试图理解它。除了位移部分之外,我了解所有内容。

我知道下面使用位移位的代码正在构建一些值来填充字节[],但我不知道为什么它具体使用右移以及为什么是 24 位,然后是 16 位,然后是 8 位?在哪里以及为什么选择这些值而不是其他值?

private void Send(NetSocket out, int MsgID, byte MsgSeq, char MsgLetter, String data) 
{
    int msglen = data.length() + 2; 
    byte[] msg = new byte[msglen + 8];
    byte[] md = data.getBytes();
    msg[0] = (byte) (msglen >> 24);
    msg[1] = (byte) (msglen >> 16);
    msg[2] = (byte) (msglen >> 8);
    msg[3] = (byte) (msglen);
    msg[4] = (byte) (MsgID >> 24);
    msg[5] = (byte) (MsgID >> 16);
    msg[6] = (byte) (MsgID >> 8);
    msg[7] = (byte) (MsgID);
    msg[8] = (byte) MsgLetter;
    msg[9] = MsgSeq;
    System.arraycopy(md, 0, msg, 10, msglen - 2);

    // send
}

最佳答案

如果你有一个 32 位整数,你可以将其视为四个 8 位整数:

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01
\---------------------/ \---------------------/ \---------------------/ \------------------/
  bits 24-31 (8 bits)     bits 16-23 (8 bits)      bits 8-15 (8 bits)     bits 0-7 (8 bits)

Big-endian 编码是您首先发送最高有效字节的位置,因此您需要第一个字节中的位 24-31,第二个字节中的位 16-23,依此类推。网络通信的标准字节顺序是大端字节序。 (Little-endian 是相反的方式,通常用于 x86 和其他一些平台上的内存存储。)

如果将整数转换为字节,则最高有效位将被丢弃。

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01
\---------------------/ \---------------------/ \---------------------/ \------------------/
  bits 24-31 (8 bits)     bits 16-23 (8 bits)      bits 8-15 (8 bits)     bits 0-7 (8 bits)


             cast to (byte)
                                                                        07 06 05 04 03 02 01
                                                                        \------------------/
                                                                          bits 0-7 (8 bits)

如果右移,则将这些位移过去,以便可以转换为(字节)并连续获取32位整数的其他部分:

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01
\---------------------/ \---------------------/ \---------------------/ \------------------/
  bits 24-31 (8 bits)     bits 16-23 (8 bits)      bits 8-15 (8 bits)     bits 0-7 (8 bits)
          |
          \---------------------------- >> 24 -----------------------------------\
                                                                                 |
                                                                        07 06 05 04 03 02 01
                                                                        \------------------/
                                                                        previously bits 24-31
                                                                        now bits 0-7 (8 bits)

关于java - 位移位 - 为什么此代码使用 24、16 和 8 右移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54520664/

相关文章:

c++ - 零位移位会正常工作吗?

java - 线程 "main"java.net.MalformedURLException : unknown protocol: c 中的异常

java - ComboBox 奇怪的行为 (JavaFX 8)

java - @:classCode 的 Haxe 使用

java - 通过 View.OnClickListener() 传递 MainActivity 的对象

vhdl - 用 VHDL 设计组合移位运算符

java - 程序运行无异常但不显示表名

c - C语言中如何反转位运算

C 在一个字节中存储 2 个数字

java - 返回X的低两个字节交换的结果