2017-12-08 2 views
-2

Ich möchte Funktion schaffen, die mich true zurück, wenn die erste Nummer (binär) in zweite Zahl enthält (binär):Wie Bitmaske zu vergleichen?

a = '1100' 
b = '0101' 

false zurück, aber:

a = '0100' 
b = '0101' 

true zurück

Wie es zu tun?

+4

Was die Bedingung verwenden, um genau Sie bisher versucht haben? – Kendas

+1

Warum nicht auf ganze Zahlen analysieren und buchstäblich bitweise Operatoren verwenden? – jonrsharpe

+0

Fragen fragen "Warum funktioniert dieser Code nicht?" muss den Code zeigen, der nicht funktioniert. – tripleee

Antwort

0

Sie können eine Liste Verständnis wie folgt verwenden:

a_list = '1100' 
b_list = '0101' 

# If a value in a_list is '1', remember if the corresponding value in b_list is '1', too 
[b == '1' for a, b in zip(a_list, b_list) if a == '1'] 
>> [False, True] 

und es dann in einer Funktion wickeln je nachdem, welche Art und Weise Sie mögen:

def contains(a_list, b_list): 
    comparison = [b == '1' for a, b in zip(a_list, b_list) if a == '1'] 
    return all(comparison) 

contains('1100', '0101') 
>> False 
contains('0100', '0101') 
>> True 
+0

Warum nicht einfach 'all (i <= j für i, j in zip ('0100', '0101'))'? –

+0

Ja, hab es schon auf 'all' geändert. Normalerweise brauche ich etwas Zeit, um mich an Python-Builtins zu erinnern und fange an, alles manuell zu machen. Zum "Gte" zugunsten dessen, was ich getan habe, denke ich, dass ich meinen Weg bevorzuge, aber deiner ist genauso gut. Und natürlich kürzer. – Arne

+0

Sie nennen die Funktion 'contains', rufen aber' compare() 'auf. Noch wichtiger, Ihre Methode überprüft nur, ob die erste Zahl eine Teilmenge der zweiten ist. 'compare ('0100', '0101')' gibt 'True' zurück, aber 'compare ('0101', '0100')' gibt 'False' zurück. – Reti43

1

Sie können dies tun, indem zunächst aus den Binärzahlen zu schaffen der Strings, und als nächstes, machen Sie eine and (&) auf die Zahlen und prüfen, ob die Ausgabe einer von ihnen entspricht.

In [14]: str_to_bin = lambda x: int(x, 2) 
    ...: 
    ...: a = '1100' 
    ...: b = '0101' 
    ...: a = str_to_bin(a) 
    ...: b = str_to_bin(b) 
    ...: print a & b in (a, b) 
    ...: 
    ...: a = '0100' 
    ...: b = '0101' 
    ...: a = str_to_bin(a) 
    ...: b = str_to_bin(b) 
    ...: print a & b in (a, b) 
    ...: 
False 
True 

Wenn Sie für a anwesend in b ausschließlich zu überprüfen,

print a & b == a 
+0

Wenn eine der Zahlen eine Untermenge der anderen ist, wird AND zu der kleineren der beiden führen. Es wäre ähnlich wie 'c & d == min (c, d)', nicht dass es viel ausmacht. – Reti43

+0

@ Reti43 Nun, für den Fall von nur 2 Ganzzahlen würde 'a & b in (a, b)' etwas besser als 'c & d == min (c, d) 'im Nanosekundenbereich sein :) –