【问题标题】:Converting two bytes into 16 bit signed number将两个字节转换为 16 位有符号数
【发布时间】:2013-08-15 16:05:05
【问题描述】:

我得到了两个字节:

byte[0] 是 0000 0000

byte[1] 是 1000 0000

我想将它们放在一起并为它们制作一个浮点值。所以结果应该是十进制的 128 和二进制的 0000 0000 1000 0000。不是负数,因为前导零。

到目前为止,我的解决方案是这种方法:

float f = (bytes[0] << 8 | bytes[1]);

但这将导致值 f 的值为负 128。这是因为我猜是2s补码。因此byte[1] 将被解释为否定的。我如何才能将byte[0] 的前导位视为负/正位?

【问题讨论】:

    标签: java binary byte bytearray twos-complement


    【解决方案1】:

    试试这个:

    short int16 = (short)(((bytes[0] & 0xFF) << 8) | (bytes[1] & 0xFF));
    

    由于运算优先,需要使用括号。

    一旦你有了 16 位整数,你就可以将它分配给你的浮点数:

    float f = int16;
    

    是的,你可以一步完成,但我想一步一步来。

    【讨论】:

    • 我面临着类似的问题,但我有四个 16 位寄存器,我需要获取长值。你能帮帮我吗?
    【解决方案2】:

    由于您正在执行一些加宽转换,由于内部使用二进制补码,您必须停止前导 1 位的传播:

    byte[] bytes = {0, -128}; // bytes[0] = 0000 0000, bytes[1] = 1000 0000
    short s = (short) (((bytes[0] & 0xFF) << 8) | (bytes[1] & 0xFF));
    System.out.println(s); // prints 128
    

    另外,float 用于浮点数,因为您需要 16 位十进制数,所以我将目标数据类型更改为 short

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 2011-10-16
      • 2022-01-17
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多