Warum UND zwei Zahlen, um einen Boolean zu bekommen?

9

Ich arbeite an einem kleinen Hardware-Interface-Projekt, das auf der Velleman k8055-Platine basiert.

Der Beispielcode kommt in VB.Net und ich schreibe dies in C # um, meistens um eine Chance zu haben, durch den Code zu gehen und einen Sinn daraus zu machen.

Eine Sache hat mich jedoch verblüfft:

In einem Schritt lesen sie alle digitalen Eingänge und setzen dann eine Checkbox, die auf der Antwort auf die gelesenen digitalen Eingänge basiert (die in einer Ganzzahl zurückkommen) und dann UND mit einer Zahl:

%Vor%

Ich habe digitale Systeme schon lange nicht mehr gemacht und ich verstehe, was sie zu tun versuchen, aber welchen Effekt hätte sie auf UND zwei Zahlen? Ist nicht alles über 0 gleich wahr?

Wie würden Sie das in C # übersetzen?

    
Gineer 27.04.2009, 08:54
quelle

10 Antworten

15

Ich denke, du musst es in folgendes übersetzen:

%Vor%

usw. Dies verwendet den bitweisen UND-Operator.

Wenn Sie den bitweisen AND-Operator verwenden, vergleicht dieser Operator die Binärdarstellung der beiden angegebenen Werte und gibt einen Binärwert zurück, bei dem nur die Bits gesetzt werden, die ebenfalls in den beiden Operanden gesetzt sind.

Zum Beispiel, wenn Sie dies tun:

2 & amp; 2

Es wird dies tun:

%Vor%

Und das ergibt:

%Vor%

Wenn Sie dann dieses Ergebnis mit 2 (0010) vergleichen, wird es natürlich wahr zurückgeben.

    
Frederik Gheysels 27.04.2009, 08:58
quelle
19

Dies macht ein bitweises UND , kein logisches UND .

Jeder von diesen bestimmt grundsätzlich, ob ein einzelnes Bit in i gesetzt ist, zum Beispiel:

%Vor%

(5 = binär 101, und 4, 2 und 1 sind die Dezimalwerte von binär 100, 010 bzw. 001).

    
Jon Skeet 27.04.2009 08:57
quelle
3

Nur hinzufügen: Es heißt Bitmasking Ссылка

Ein boolescher Wert benötigt nur 1 Bit. In der Implementierung der meisten Programmiersprache benötigt ein Boolescher Wert mehr als ein einzelnes Bit. Im PC wird dies keine große Verschwendung sein, aber eingebettete Systeme haben normalerweise sehr begrenzten Speicherplatz, so dass die Verschwendung wirklich von Bedeutung ist. Um Speicherplatz zu sparen werden die Booleschen Werte zusammen gepackt. Auf diese Weise nimmt eine boolesche Variable nur 1 Bit in Anspruch.

Sie können sich so etwas wie eine Array-Indexierungsoperation vorstellen , wobei ein Byte (= 8 Bits) zu einem Array von 8 booleschen Variablen wird. Vielleicht ist das Ihre Antwort: Verwenden Sie ein Array von Booleschen.

    
RichN 27.04.2009 09:15
quelle
1

Stellen Sie sich das im Binärformat vor.

%Vor%

ergibt 00000010

d. nicht Null. Nun, wenn der erste Wert

war %Vor%

würdest du

bekommen %Vor%

d. Null.

Beachten Sie die weitere Division, um alles auf 1 oder 0 zu reduzieren.

    
Brian Agnew 27.04.2009 08:58
quelle
1

(i und 16) / 16 extrahiert den Wert (1 oder 0) des fünften Bits.

%Vor%     
Dario Solera 27.04.2009 08:59
quelle
1

Und operator führt "... bitweise Konjunktion auf zwei Zahlen aus Ausdrücke ", die auf '|' in C #. Die '' ist eine Ganzzahldivision , und äquivalent in C # ist / , vorausgesetzt, dass beide Operanden sind Integer-Typen.

    
Anton Gogolev 27.04.2009 08:59
quelle
1

Die konstanten Zahlen sind Masken (denke an sie binär). Also, was der Code tut, ist die Anwendung des bitweisen UND Operators auf das Byte und die Maske und dividiere durch die Zahl, in um das Bit zu bekommen.

Zum Beispiel:

%Vor%     
alkar 27.04.2009 09:05
quelle
1

In C # verwenden Sie direkt die BitArray-Klasse indexieren einzelne Bits.

Um ein einzelnes Bit zu setzen, i ist einfach:

%Vor%

Um ein einzelnes Bit zurückzusetzen i ist ein wenig peinlicher:

%Vor%

Seien Sie sich bewusst, dass sowohl die bitweisen Operatoren als auch die Shift-Operatoren dazu neigen, alles nach int zu fördern, was unerwarteterweise eine Umwandlung erforderlich machen kann.

    
Peter Wone 27.04.2009 09:28
quelle
1

Wie gesagt, ist dies ein bitweises UND, kein logisches UND. Ich sehe, dass das schon einige Male vor mir gesagt wurde, aber IMO sind die Erklärungen nicht so einfach zu verstehen.

Ich mag es so zu denken:

Schreibe die Binärzahlen untereinander auf (hier mache ich 5 und 1):

%Vor%

Nun müssen wir dies in eine Binärzahl umwandeln, in der alle 1en von der ersten Zahl, also auch von der zweiten, übertragen werden, also - in diesem Fall:

%Vor%

In diesem Fall sehen wir, dass es dieselbe Nummer wie die zweite Zahl gibt, in der diese Operation (in VB) wahr zurückgibt. Schauen wir uns die anderen Beispiele an (mit 5 als i):

(5 und 2)

%Vor%

(falsch)

(5 und 4)

%Vor%

(richtig)

(5 und 8)

%Vor%

(falsch)

(5 und 16)

%Vor%

(falsch)

EDIT: und offensichtlich vermisse ich den ganzen Punkt der Frage - hier ist die Übersetzung zu C #:

%Vor%     
kastermester 27.04.2009 09:06
quelle
1

Ich bevorzuge hexadezimale Schreibweise beim Bit-Twiddling (z. B. 0x10 statt 16). Es macht mehr Sinn, wenn Sie Ihre Bittiefen erhöhen, da 0x20000 besser ist als 131072.

    
Jason Morse 27.04.2009 19:37
quelle

Tags und Links