それは私が間違った仮定を行う場合ので、私を修正してくださいどのような問題であり、何を達成したい、完全には明らかではありません。
とにかく、整数をバイナリ表現に変換するのは、bin
を使って簡単に行えます。たとえば、bin(5)
は'0b101'
です。さて、bin(-5)
は'-0b101'
です。これは他の言語のバイナリに使用されているときに期待したものではありません。 C.
「問題」は、Pythonの整数はではなく、の固定サイズです。 int16
,int32
,uint8
などはありません。 Pythonは必要なだけビットを追加します。つまり、負の数は、がその補数で表されないことを意味します。0b11111011
は、ではなく-5
ですが、バイナリは潜在的に無限であるため、符号ビットを配置する固定位置はありません。したがって、Pythonは明示的単項を追加する必要があります-
。これはと異なるから-5
を文字列として"-"
と"5"
と解釈しています。
負の値のバイナリ表現を取得する場合は、の固定サイズの整数を自分で作成する必要があります。あなたが最初に望んでいた何をすべきか今
def bin_int(number, size=8):
max_val = int('0b' + ('1'* (size - 1)), 2) # e.g. 0b01111111
assert -max_val <= number <= max_val, 'Number out of range'
if number >=0:
return bin(number)
sign = int('0b1' + ('0' * size), 2) # e.g. 0b10000000
return bin(number + sign)
を、::これは次のようになりますん機能は、ファイルに数字のバイナリ表現を記述します。
output_list = [1, -1, -5, -64, 0] # iterable *containing* integers
with open(filename, 'w') as output_file: # with statement is safer for writing
for number in output_list:
output_file.write(bin_int(number) + '\n')
それとも、ただ結果をチェックしたい場合:
print([bin_int(number) for number in [1, -1, -5, -64, -127]])
# ['0b1', '0b11111111', '0b11111011', '0b11000000', '0b10000001']
(注)0b
を削除したい場合は、あなたが行うことができますようbin_int(number)[2:]
を経由して、例えばをoutput_file.write(bin_int(number)[2:] + '\n')
。これにより、バイナリ表現を保持する文字列から最初の2文字が削除されます。
期待される結果は何ですか?バイナリ形式の絶対値?予想される入出力が役に立つでしょう。 – brianpck
はい、私はバイナリで絶対値を必要とします。入力= -5の場合、出力は= 11111011 – rrra
になります。これは 'abs(-5)'のバイナリではありません... – brianpck