有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

位操作使用逐位逻辑对Java中的Int32进行尾数(有效位)解码

我知道这听起来像是以前问过的问题,但在我的例子中,我被要求对int32值进行一些位逻辑,并将其解释为浮点,不是将值转换为浮点,而是将与之相关联的二进制值解释为浮点,并在集合中查找有效位(也称为尾数)。我使用IEE-754标准进行转换

说明如下:

“使用位掩码隔离有效数字,然后使用循环对每个数字进行迭代,根据需要进行移位以使其处于LSB位置,并乘以适当的2次幂。结果将是一个没有指数的浮点。”。 不要忘记包含“隐藏”位! 考虑一个循环倒计时-仔细处理它,它会让你从LSB开始,然后工作到MSB。"

根据我对这一点的理解,我制作了这个令人憎恶的东西

    public static float decodeSignificantDigits(int value) {
    int mask = 0x007FFFFF;
    int significantBits = value & mask;
    float significantDigits = 0;
    
    for (int i = -23; i <= 0; i++) {
        if (i != 0) {
            significantDigits += (significantBits >> 1) * Math.pow(2, i);
            
        } else {
            significantDigits += 1 * Math.pow(2, i);
        }
        
    }
    System.out.println(significantDigits);
    return significantDigits;
}

我认为我在这方面是正确的,但我只是无法想象如何让它正常工作

主要目的是通过以下测试:

@Test
void testWhenAllOnes() {
    int bits = 0b00000000011111111111111111111111;
    int bitsWithExpoentZero = 0b00111111111111111111111111111111;
    assertEquals(Float.intBitsToFloat(bitsWithExpoentZero), FloatDecoder.decodeSignificantDigits(bits), TOL);
}

@Test
void testWhenMsbOfSignificantDigitsIsOneRestZeroes() {
    int bits = 0b00000000010000000000000000000000;
    int bitsWithExpoentZero = 0b00111111110000000000000000000000;
    assertEquals(Float.intBitsToFloat(bitsWithExpoentZero), FloatDecoder.decodeSignificantDigits(bits), TOL);
}

@Test
void testWhenLsbOfSignificantDigitsIsOneRestZeroes() {
    int bits = 0b00000000000000000000000000000001;
    int bitsWithExpoentZero = 0b00111111100000000000000000000001;
    assertEquals(Float.intBitsToFloat(bitsWithExpoentZero), FloatDecoder.decodeSignificantDigits(bits), TOL);
}

我还被告知不要使用整数。ToBinarysting()用于我的解决方案


共 (0) 个答案