如何清除字节中最重要的位?

时间:2015-12-17 11:21:36

标签: java byte bit

我想从字节解析温度。

温度由2个字节组成。第一个字节的最高有效位表示温度是正还是负。

这是我到目前为止所做的:

public double parseTemperatureBytes(byte[] temperatureBytes) {
    // Must be divided by 10 (1 decimal)
    // First bit indicates sign (bit 1 = negative, bit 0 = positive)
    // Range [0x7FFF] : [-3276.7 … +3276.7]

    byte firstByte = temperatureBytes[0];
    int positiveOrNegative = ParseUtils.getMostSignificantBit(firstByte);
    boolean isPositive = positiveOrNegative == 0;

    String temperatureHex = ParseUtils.bytesToHex(temperatureBytes);
    int temperatureHexToInteger = Integer.parseInt(temperatureHex, 16);
    double temperature = temperatureHexToInteger / (double) 10;

    if (!isPositive) {
        temperature = -temperature;
    }

    return temperature;
}


// ParseUtils

public static int getMostSignificantBit(byte b) {
    return (b & 0xff) >> 7;
}

这有效,但我仍然要确保忽略第一个字节的最高位。它只是一面旗帜而不是温度的一部分。

例: 如果我传入0xFFFF它返回-6553.5但它应该是-3276.7

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:2)

您可以使用以下代码检查给定温度是否为负值。

public static int getMostSignificantBit(byte b) {
    return b & 0x80;
}

您可以使用以下代码获取温度值。

public static double parseTemperatureBytes(byte[] temperatureBytes) {
    int firstByte = temperatureBytes[0] & 0x7F;
    int secondByte = temperatureBytes[1] & 0xFF;
    double temperature = ((firstByte << 8) | secondByte) / 10.0;

    if (getMostSignificantBit(temperatureBytes[0]) > 0) {
        temperature = -temperature;
    }

    return temperature;
}

答案 1 :(得分:1)

十六进制值f相当于二进制值1111. 0111是1 + 2 + 4 = 7所以0x7f变为01111111。

return b &  0x7f;

答案 2 :(得分:1)

您可以使用0x7f掩码重置最高有效位,然后使用二进制移位和按位或者构造2字节值。

int high = temperatureBytes[0] & 0x7f;
int low = temperatureBytes[1];
int value = (high << 8) | low;
double temperature = value / 10.0;

答案 3 :(得分:0)

减去MSB的大小。如果设置了该位,则您的数字至少为32768.因此减去该数量。

if(num> 3276.8)num = num - 3276.8;