【问题标题】:How do I split an integer into 2 byte binary?如何将整数拆分为 2 字节二进制?
【发布时间】:2009-11-14 22:32:56
【问题描述】:

给定

private int width = 400;
private byte [] data = new byte [2];  

我想把整数“宽度”分成两个字节,用高字节加载 data[0],用低字节加载 data[1]。

即二进制值 400 = 1 1001 0000 所以 data[0] 应该包含 0000 0001 和 data[1] 应该包含 1001 0000

【问题讨论】:

    标签: java


    【解决方案1】:

    使用简单的按位运算:

    data[0] = (byte) (width & 0xFF);
    data[1] = (byte) ((width >> 8) & 0xFF);
    

    工作原理:

    • & 0xFF 屏蔽除最低八位以外的所有位。
    • >> 8 通过将所有位向右移动 8 位来丢弃最低 8 位。
    • 强制转换为字节是必要的,因为这些按位运算在int 上工作并返回int,它是比byte 更大的数据类型。这种情况是安全的,因为所有非零位都适合byte。如需更多信息,请参阅Conversions and Promotions

    编辑: Taylor L 正确地指出,虽然 >> 在这种情况下有效,但如果将此代码概括为 4 个字节,它可能会产生不正确的结果(因为在Java int 是 32 位)。在这种情况下,最好使用>>> 而不是>>。如需更多信息,请参阅Java tutorial on Bitwise and Bit Shift Operators

    【讨论】:

    • >> 可能不是您想要的。 >>> 移位时不携带符号位,因此如果您想捕获所有 4 个字节,在这种情况下使用可能会更好。
    • 如果我执行“new byte[]{width & 0xFF, (width >> 8) & 0xFF}”,编译器会说“可能会丢失精度所需的字节 int”
    • @Kevin:我看到我忘了投给byte。将更新答案。
    • @Taylor:会检查一下,但为什么 Stephan 的代码不起作用?
    • 你不需要面具,演员会切断多余的位。使用>> 或>>> 无关紧要,由于符号扩展而导致的将被切断。虽然我会考虑 >>> 更好的风格。
    【解决方案2】:

    要转换两个字节,最干净的解决方案是

    data[0] = (byte) width;
    data[1] = (byte) (width >>> 8);
    

    将整数转换为四个字节的代码是

    data[0] = (byte) width;
    data[1] = (byte) (width >>> 8);
    data[2] = (byte) (width >>> 16);
    data[3] = (byte) (width >>> 24);
    

    无论使用>>还是>>>进行移位都没有关系,由符号扩展创建的任何一位都不会在结果字节中结束。

    另见this answer

    【讨论】:

      【解决方案3】:

      对于 4 字节的 int,这应该可以满足您的需求。请注意,它将低字节存储在偏移量 0 处。我将把它作为练习留给读者根据需要对其进行排序。

      public static byte[] intToBytes(int x) {
          byte[] bytes = new byte[4];
      
          for (int i = 0; x != 0; i++, x >>>= 8) {
              bytes[i] = (byte) (x & 0xFF);
          }
      
          return bytes;
      }
      

      【讨论】:

        【解决方案4】:

        整数在 java 中是 32 位(=4 字节),你知道吗?

        width & 0xff 会给你第一个字节, width & 0xff00 >> 8 会给你第二个,等等。

        【讨论】:

          【解决方案5】:

          要获取高字节,请右移 8 位,然后屏蔽顶部字节。同样,要获取低字节,只需屏蔽顶部字节即可。

          data[0] = (width >> 8) & 0xff;
          data[1] = width & 0xff;
          

          【讨论】:

          • 道歉 - 试图说明原理,但你是对的!
          【解决方案6】:
          int width = 400;
          byte [] data = new byte [2];
          
          data[0] = (byte) ((width & 0xFF00) >> 8);
          data[1] = (byte) (width & 0xFF);
          
          for(int b = 0; b < 2; b++) {
              System.out.println("printing byte " + b);
              for(int i = 7; i >= 0; i--) {
                  System.out.println(data[b] & 1);
                  data[b] = (byte) (data[b] >> 1);
              }
          }
          

          【讨论】:

            【解决方案7】:

            我建议你看看 HeapByteBuffer 的源代码。它具有所有原始数据类型的转换代码。 (事实上​​你可以只使用一个 ByteBuffer ;)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-03-09
              • 2021-11-30
              • 2021-10-08
              相关资源
              最近更新 更多