bitweise AND, "a & b", sollte man sich als
function _bitwise_and(A,B):
# A and B are Python expressions
# which result in lists of 1's and 0's
a = A.evaluate()
b = B.evaluate()
return [ 1 if abit==1 and bbit==1 else 0 for abit,bbit in zip(a,b)]
so, grafisch,
a: ... 0 1 1 0
b: ... 1 0 1 0
--------
a&b ... 0 0 1 0 <- each bit is 1 if-and-only-if the
corresponding input bits are both 1
und das Ergebnis ist eine Liste von Bits, in eine ganze Zahl gepackt.
.
Logisches UND, "a und b", sollte statt als
function _and(A,B):
# A and B are Python expressions which result in values having truthiness
a = A.evaluate()
if is_truthy(a):
b = B.evaluate()
return b
else:
return a
gedacht werden.
Hinweis: wenn das Ergebnis der A falsy ist, B wird nie ausgewertet - also, wenn Ausdruck B hat einen Fehler bei der Auswertung, bitweise und wird in einem Fehler während logisch und wird nicht führen.
Dies ist die Grundlage für das gemeinsame Python Idiom
while (offset in data) and test(data[offset]):
do_something_to(data[offset])
next offset
..., da die Daten [offset] nur Offset ausgewertet wird, wenn ein nutzbarer (non-error-produzierenden) Wert.
Mit '&' anstelle von 'und' garantieren Sie einen Fehler durch Auswertung der Daten [last_offset + 1] am Ende Ihrer Schleife.
.
Natürlich ist dies mit einem anderen gemeinsamen Idiom hätte vermieden werden können:
for ch in string if ch=='c':
do_something_to(ch)
die insgesamt Indexerror Probleme vermeidet.
Warum verwenden Sie den bitweisen '&' Operator? –
Nicht das ist ein Rad neu erfassender Code. Wie wäre es mit 'p = string.find (c)' (gibt -1 statt 'len (string) -1 'zurück, wenn es nicht da ist - also ist es noch besser, wie in, nicht mehrdeutig)? – delnan