2016-04-28 6 views
0

SourceWarum benötigt pythons zlib.crc32 ein bitweises AND, um als "stabil" betrachtet zu werden?

in Version 3.0 geändert: Immer gibt einen Wert ohne Vorzeichen. Verwenden Sie crc32 (Daten) & 0xffffffff, um denselben numerischen Wert über alle Python-Versionen und -Plattformen zu generieren.

Aber warum müssen wir eine bitweise und mit einer binären Zahl auf alle 1's setzen? Wird das Ergebnis nicht gleich sein (wie bei jeder Binärzahl BITWISE ANDED mit allen 1en wird immer die gleiche Binärzahl sein)? Dieses scheinbar willkürliche Detail macht mich unbehaglich.

Antwort

3

Die bitweise & erzwingt eine Konvertierung des Werts in eine vorzeichenlose Ganzzahl. Betrachten wir zum Beispiel:

>>> -2 & 0xffffffff 
4294967294 

Basierend auf den Kommentar, den Sie zitiert haben, in 3,0 Python wurde geändert immer einen nicht signierten Wert zurück, während in früheren Versionen der crc32() Methode ein signiertes Wert zurückgegeben haben.

Zum Beispiel in Python 2.7.11:

>>> crc32('the quick brown fox') 
-1849621814 

Aber in Python 3.4.3:

>>> crc32(b'the quick brown fox') 
2445345482 

Sie also hier verschiedene Werte, aber wenn in Python 2.7 Sie führen die bitweise und, Sie erhalten den gleichen Wert wie in Python 3.4:

>>> crc32('the quick brown fox') & 0xffffffff 
2445345482 
+0

Nur um zu klären, die bitweise und Operator (w/nichts mit Python zu tun) ausführen d auf einer binären Zahl und einer binären Zahl, die aus allen 1en besteht - per Definition würde niemals irgendwas 'XXXX' &' 1111' = 'XXXX' immer ändern. Es passiert einfach, dass in python der bitweise Operator auch die Zahlen in unsigned umwandelt. Ist das richtig? (Beachte, dass dies nicht gleichbedeutend ist mit der Verwendung von Bauchmuskeln.) Ist mein Denken richtig? – AlanSTACK

Verwandte Themen