2010-04-17 14 views
12

Ich habe den folgenden Code, und ich kann nicht verstehen, was es bedeutet:Was bedeutet Operation "| =" in C++?

var1 |= var2>0 ? 1 : 2; 

Wer kann mir helfen, bitte!

+1

in CS, es heißt ein „com Pfund Zuordnung ". –

+2

Sie sollten über die Sprache nachlesen. – starblue

+0

FYI, dies ist auch in Java gegeben, z. 'int var1, var2'. – polygenelubricants

Antwort

21
if (var2 > 0) 
    var1 = var1 | 1; 
else 
    var1 = var1 | 2; 

Es ist bitweise oder.

12

Alle a op= b Operatoren sind eine Verknüpfung zu a = a op b.

Da C++ jedoch op und op= separat außer Kraft setzen kann, müssen Sie darauf achten, dass jeder Implementierer von benutzerdefinierten Typen konsistent ist.

+1

Ich würde halten böse jemand Durchführung verschiedene Aufgaben in '@' und '@ =': s –

+1

@Matthieu: C++ (und, IMO, wird es immer sein) eine Sprache, die Ihnen viel Seil gibt, mit denen sie hängen. – Richard

+0

Ich kenne niemanden, der sie implementiert, um ein anderes Verhalten zu haben (außer dass die zusammengesetzte Zuweisung offensichtlich ihren linken Operanden ändert). Aber das Implementieren eines ohne das andere ist ziemlich üblich, z. Iostreams Einfügeoperatoren. –

2

Operator | = bedeutet Zuordnung von Bit-Operator OR

4

Wie bereits gesagt wurde es für v1 = v1 | v2; Eine andere Anwendung Sie across ist mit booleans kommen könnte kurz ist.
Gegeben:

b |= a; 
6

cond ? x : y kehrt x wenn cond wahr ist und y anders:

if(a) 
    b = true; 

man sehen:

bool b = /*some value*/ 

Statt zu sagen. Lesen Ternary Operator

a |= b ist eine Abkürzung für a = a | b die a | b zu a

a | b ist bitwise OR von a und b zuweist. (z. B. 2 | 3 = 3 und 1 | 2 = 3)

+0

2 | 3 = 3, oder? – Cowan

+0

@Cowan: danke und aktualisiert. –

3

Wie andere Leute vor mir erwähnt haben, bedeutet dies, dass Sie mit Zuweisungen durch bitweises ODER enden.

Bitweises ODER kann dargestellt werden, indem das Bitmuster links und rechts genommen und übereinander gelegt wird.

In jeder Spalte: 0 + 0 gibt 0, 1 + 0 ergibt 1, 0 + 1 gibt 1, 1 + 1 1.
Im Zusammenhang mit booleans gibt: falsch ODER falsch == false, true oder false == Wahr, Falsch ODER Wahr == Wahr, Wahr ODER Wahr == Wahr.

Hier ist ein Beispiel für bitweise OR und das resultierende Bitmuster: var1 (11) | = var2 (14) -> var1 (15)

 
    1011 (11) 
OR 1110 (14) 
= 1111 (15) 
4

Ganze Zahlen können binär dargestellt werden, so dass jede Stelle (Bit-Schalter) ist 1 (eIN) oder 0 (aus):

00000000 == 0 
00000001 == 1 
00000010 == 2 
00000011 == 3 
00000100 == 4 
00001000 == 8 
00010000 == 16 

bitweise OR kombiniert zwei Zahlen, die durch die beiden Sätze von Bits "merging":

First number:  00110000 
Second number: 00000010 
Result:   00110010 

Wenn ein Bit 1 in einer der beiden Eingangszahlen ist, dann wird es 1 in der Folge sein.

Vergleichen mit bitweise AND, die die „Überlappung“ der beiden Sätze von Bits findet:

First number:  00110100 
Second number: 10011110 
Result:   00010100 

Wenn ein Bit 1 ist in beiden der Eingabe von Zahlen, dann wird es 1 in der Folge sein.

Wenn die Zahlen in Variablen a und b sind, können Sie den Ort, die bitweise OR/AND Ergebnisse in eine neue Variable c:

unsigned int c = a | b; // OR 

unsigned int c = a & b; // AND 

Oft ist das Ergebnis in eine der beiden Variablen gesetzt werden muss ,

unsigned int c = a | b; // OR 
c = a; // copy 

so als Abkürzung dh, können Sie dies in einem einzigen Schritt tun:

a |= b; // merge b directly into a