整数或浮点数转换为二进制(有符号或无符号)

问题描述 投票:0回答:1

有什么建议可以纠正这个问题吗? 例子; 输入浮点数:-34.5 二进制:1101 1110.1#-33.5 输出不正确, 因为: 1 1 0 1 1 1 1 0 1 -128+64+0+16+8+4+2+0+0.5=-33.5

输出应该是: 1101 1101.1#-34.5

因为: 1 1 0 1 1 1 0 1.1 -128+64+0+16+8+4+0+1+.5 = -34.5

def twos_complement(binary):

    complement = ''.join('1' if bit == '0' else '0' if bit == '1' else bit for bit in binary)

    carry = 1

    result = ''

    for bit in complement[::-1]:      

        if bit == '1' and carry == 1:

            result += '0'

        elif bit == '0' and carry == 1:

            result += '1'

            carry = 0

        else:

            result += bit

    return result[::-1]



def integer_to_binary(integer):

    num_bits = integer.bit_length()

    num_bits = max(num_bits, 8)



    if integer >= 0:

        binary_value = bin(integer)[2:].zfill(num_bits)

        binary_value = ('0' * 4) + binary_value

        binary_value = ' '.join(binary_value[max(0, i - 4):i][::-1] for i in range(len(binary_value), 0, -4))

        return binary_value[::-1]

    elif 0 > integer >= -128:

        binary_value = bin((1 << num_bits) + integer & ((1 << num_bits) - 1))[2:].zfill(num_bits)

        binary_value = ('1' * 4) + binary_value

        binary_value = ' '.join(binary_value[max(0, i - 4):i][::-1] for i in range(len(binary_value), 0, -4))

        return binary_value[::-1]

    elif integer <= -129:

        binary_value = bin(integer)[3:].zfill(num_bits)

        binary_value = ('1' * 4) + twos_complement(binary_value)

        binary_value = ' '.join(binary_value[max(0, i - 4):i][::-1] for i in range(len(binary_value), 0, -4))

        return binary_value[::-1]



def float_to_binary(mixed):

    integer_part, decimal_part = str(mixed).split('.')

    binary_integer_part = integer_to_binary(int(integer_part))



    binary_decimal_part = ''

    if decimal_part != '0':

        decimal_part = '0.' + decimal_part

        decimal = float(decimal_part)

        while decimal != 0:

            decimal *= 2

            binary_decimal_part += str(int(decimal))

            decimal -= int(decimal)



    result = binary_integer_part + '.' + binary_decimal_part

    return result



input = float(input("Enter a float number: "))

result = float_to_binary(input)

print("Binary:", result)

我将整数和小数分开,然后将整数部分用作integer_to_binary函数的参数,将其转换为二进制。 但小数部分通过重复乘以 2 并取结果的整数部分来转换为二进制。

如果预期输出是整数(负或正)和浮点数(仅限正),我的代码没有不正确的问题。 仅当预期输出为浮点数且为负数时,才会出现问题。

我想要的是,如果输入是负浮点数。输出应该是正确的。

python math binary type-conversion
1个回答
0
投票

好吧,首先,我尝试调试你的代码,老实说,对于像

(binary_value[max(0, i - 4):i][::-1] for i in range(len(binary_value), 0, -4))
这样的生成器表达式或像这个令人讨厌的表达式
bin((1 << num_bits) + integer & ((1 << num_bits) - 1))


这样的未注释的按位运算符,这并不容易 另外,我真的认为你的代码也可以更加简化,例如,当我不断调试多个测试用例时,唯一一次调用
twos_complement(binary_value)
的时候是
integer <= -129
并且传递的参数是一个只有 0 和 1 的字符串,所以定义中的第一个生成器表达式
def twos_complement(binary)
可能是
complement = ''.join('1' if bit == '0' else '0' if bit == '1' for bit in binary)
而且我仍然认为这种方法要困难得多,毕竟有一种更优雅的方法来获取 2 的补码,而不是进行 1 的补码并添加 1,你可以检查一下这里

现在终于回答你的问题了,你在代码中犯的错误是你取了 整数部分 = -34 (对于
input = -34.5
)然后得到它的
binary_integer_part
然后取 小数部分 = 0.5 并得到它的
binary_decimal_part
,但最终你连接两个字符串并返回结果,在这种情况下,如果转换为十进制,则结果将等于=integerpart+decimal_part=-34+0.5=-33.5。因此,使用您提供的代码,您可以以您正在寻找的格式获得 -34.5 if
input = -35.5
因为结果将是 = -35 + 0.5 = -34.5 我尝试并给出了所需的输出。希望我回答了您的担忧:)

© www.soinside.com 2019 - 2024. All rights reserved.