2017-06-28 5 views
0

Ich möchte ein Wort als eine Sequenz von 26 Bits darstellen. Wenn das 25. Bit gesetzt ist, bedeutet dies, dass der Buchstabe "y" in diesem Wort vorhanden ist.Darstellen eines Wortes als Folge von Bits

Zum Beispiel: Wort: "abekz" Darstellung: 10000000000000010000010011 Dies ist sehr einfach in C/C++ zu tun, da es einen 32-Bit-int-Typen hat. Aber Pythons Int hat eine unendliche Genauigkeit, deshalb kann ich es nicht machen.

Hier ist meine (Falsch) Lösung:

def representAsBits(string): 
    mask=0 
    for each_char in string: 
    bit_position= ord(each_char)-97 #string consists of only lower-case letters 
    mask= mask | (1<<bit_position) 
    return bin(mask) 

print representAsBits("abze")# gives me 0b10000000000000000000010011 
print representAsBits("wxcc")# gives me 0b110000000000000000000100 2 bits missing here 

Welche Veränderungen kann ich machen? Vielen Dank!

+0

Ihre Lösung ist richtig, die 2 "fehlenden Bits" sind nur die führenden '0's, also zeigt es Ihnen nicht. "a" ergibt "0b1". Wenn Sie das Ganze ausdrucken wollen, müssen Sie es mit den führenden Nullen auffüllen. – TemporalWolf

+0

Ja, aber ich möchte, dass es automatisch gemacht wird, anstatt Nullen manuell zu patchen. Gibt es eine Möglichkeit, 32 Bit int in Python zu bekommen? – Sameer

+0

Das int ist nicht, was das Problem ist, Sie wollen es auf eine bestimmte Weise ** anzeigen **. Diese Methode funktioniert und erzeugt richtige ganze Zahlen mit den entsprechenden gesetzten Bits. Die Bits werden nicht angezeigt, da sie führende Bits sind. '0b0000000001 == 0b1' ist' True', weil es die gleiche Nummer ist. – TemporalWolf

Antwort

1

Sie können keine führenden Nullen für eine ganze Zahl speichern. Glücklicherweise verwenden Sie bin(), die eine Zeichenfolge zurückgibt.

Mit ein wenig kreativ Slicing, können wir es formatiert aber wir wollen:

return "0b%32d" % int(bin(mask)[2:]) 

geben:

>>> representAsBits("abekz") 
'0b00000010000000000000010000010011' 

Das, gesagt Masken vergleichen, Sie müssen nicht bin() sie, außer wenn Sie die Binärdatei "zeigen" möchten. Vergleichen Sie die Zahlen selbst, die gleich sein wird:

mit return mask:

>>> representAsBits("z") == representAsBits("zzz") 
True 

Obwohl, da werden die Masken passen, es egal, auf welchem ​​padding Sie verwenden, da sie das sein wird, Gleiches, wenn es von derselben Maske erzeugt wird: Jede Zeichenkette, die nur die Zeichen wxc enthält, liefert die gleiche Zeichenkette, unabhängig davon, welche Methode Sie verwenden.

+0

Okay, also Wenn ich eine 26-Bit-Maske mit einer 24-Bit-Maske vergleiche, packt Python automatisch die 24-Bit mit zwei zusätzlichen Nullen auf, während sie sie zusammen anordnen? Mein schließliches Ziel ist es, einfach UND sie nach gemeinsamen Buchstaben zu suchen. – Sameer

+0

gibt es keine "26 Bit Maske" oder "24 Bit Maske" s. Es gibt nur ganze Zahlen, die Sie auf eine bestimmte Art interpretieren. Python wird richtig bitweise und ('&') Integer: '0b11111 & 0b101' ergibt' 5', das ist '0b101' – TemporalWolf

+1

Untersucht man auch nach Unterscheidbarkeit, kann man ein [bitweises xor ('^')] (https : //wiki.python.org/moin/BitwiseOperators), die nur dann '0' ** ergibt, wenn sie ** entsprechen. – TemporalWolf