Ruby: Was macht das Snippet: (num & 1) == 0 genau?

9

Ich habe mir ein Meta-Video von PragProg angesehen, und Dave Thomas hat diesen Codeschnipsel gezeigt:

%Vor%

Jetzt verstehe ich, was hier vor sich geht, aber ich weiß nicht, was genau mit dem (num & 1) -Teil der Math.is_even? -Klassenmethode passiert. Ich weiß, es ist eine bitweise Operation, aber das ist es. Kann mir jemand erklären, was mit dieser Codezeile passiert? Danke.

    
agentbanks217 06.11.2010, 20:37
quelle

3 Antworten

14

& ist ein bitweiser UND-Operator. Doing (num & 1) überprüft, ob das letzte Bit (niedrigstwertige Bit) der Nummer gesetzt ist. Wenn es gesetzt ist, ist die Zahl ungerade, und wenn es nicht gesetzt ist, ist es gerade.

Es ist nur ein schneller Weg, um zu überprüfen, ob eine Zahl gerade oder ungerade ist.

Sie können hier eine Liste der rubinweisen bitweisen Operatoren sehen: Ссылка

    
Alan Geleynse 06.11.2010, 20:39
quelle
18

Es ist ein kleiner Trick: Jede Binärzahl, die das niedrigstwertige Bit zu 0 hat, ist sonst gerade und ungerade. Dies, weil die Zweierpotenzen 1,2,4,8,16,... sind. Was passiert, ist, dass wenn du bitweise AND mit 1 machst, du 0 erhältst, wenn das am wenigsten signifikante Bit 0 und 1 ist. So können Sie leicht erkennen, wenn eine Zahl, wenn Sie das tun.

Natürlich funktioniert das nur, weil die in CPUs verwendete Arithmetik binär ist, sonst wäre es nur Mist.

nur ein Beispiel

%Vor%

umgekehrt

%Vor%     
Jack 06.11.2010 20:42
quelle
3

x & y ist eine Zahl, bei der für alle i das i th Bit 1 ist und nur dann, wenn das i th Bit von x und das i th Bit von y 1 sind und 0 sonst.

Da 1 die Zahl ist, bei der nur das letzte Bit 1 ist, ist x & 1 1, wenn das letzte Bit von x 1 ist und andernfalls 0.

Da das letzte Bit einer Zahl 1 ist, wenn es ungerade ist, und 0, wenn es gerade ist, ist die Überprüfung, ob x&1 0 ist, äquivalent zur Überprüfung, ob eine Zahl gerade ist.

    
sepp2k 06.11.2010 20:42
quelle

Tags und Links