位操作使用逐位逻辑对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) 个答案