2011-09-13 7 views
4

にバイナリ文字列を変換する。私はでビットを記憶していたオブジェクトを持っているフロート

class Bitset: 
    def __init__(self, bitstring): 
     self.bitlist = [] 
     for char in bitstring: 
      self.bitlist.append(int(char)) 

    def flipBit(self, index): 
     val = self.bitlist[index] 
     val = (val + 1) % 2 
     self.bitlist[index] = val 
     self.newBitstring() 

    def bitstring(self): 
     newString = '' 
     for val in self.bitlist: 
      newString = newString + str(val) 
     return newString 

    def __len__(self): 
     return len(self.bitlist) 

    def __str__(self): 
     return self.bitstring() 

    def __repr__(self): 
     return self.bitstring() 

は私がフロートにビットを変換することができとにかくありますか?ありがとう。

+0

「ビットを浮動小数点に変換する」とは何を意味するのかよく分かりません。 C型の型キャストと同等の処理をしたいですか(つまり、システムがビット列を浮動小数点として解釈するようにしますか?)また、宿題に問題がある場合は、[宿題]タグを追加する必要があります。 –

+0

ありがとうございます。本質的にCタイプキャストです。しかしこれは宿題の問題ではない。私はこれをどうやって行うのか分かりません。 – nickles

+0

'struct.unpack'を試してください – JBernardo

答えて

4

ここでは機能するソリューションです。 as_float32をas_float64に拡張するには、 "I"を "L"に、 "f"を "d"に置き換えます。説明については、struct documentationを参照してください。

def as_float32(self): 
    """ 
    See: http://en.wikipedia.org/wiki/IEEE_754-2008 
    """ 
    from struct import pack,unpack 
    s = self.bitlist 
    return unpack("f",pack("I", bits2int(s))) 

# Where the bits2int function converts bits to an integer. 
def bits2int(bits): 
    # You may want to change ::-1 if depending on which bit is assumed 
    # to be most significant. 
    bits = [int(x) for x in bits[::-1]] 

    x = 0 
    for i in range(len(bits)): 
     x += bits[i]*2**i 
    return x 
+0

スパイダーウィンドウのコードをあなたのオブジェクトで動くべきものに適合させたときに、私はいくつかのエラーを見つけました。彼らは今修正する必要があります。 –

5

ホイールを再構成したくない場合は、このすべてを行うことができるライブラリがあります。私bitstringライブラリは助けることができる:

>>> from bitstring import BitArray 
>>> a = BitArray(float=0.34, length=32) 
>>> a.bin 
'00111110101011100001010001111011' 
>>> a.float 
0.3400000035762787 
>>> a.bin = '01001001011101000010010000000000' 
>>> a.float 
1000000.0 
>>> a.bytes = 'helloall' 
>>> a.float 
7.819486525216155e+194 

32または64ビットであるとき解釈が唯一許可されたフロート。詳細はdocumentationをご覧ください。

+1

IEEE754とbinary32表記の間で変換するのに便利なライブラリ – Prashant