Funktion ^= Operator

Moderator #6131892
Lesenswert?

Programmierer schrieb:
> und ^ ist die bitweise Version von ...?

Von ^ gibt es in C kein logisches Äquivalent. Die Wertetabelle dafür
sähe (analog zu && und ||) so aus:

1
  x   y   x xor y
2
――――――――――――――――――
3
 =0  =0      0
4
 =0  ≠0      1
5
 ≠0  =0      1
6
 ≠0  ≠0      0
7
――――――――――――――――――

2 xor 1 sollte also 0 (false) ergeben, weil beide Operenden von null
verschieden (true) sind.
Gast #6131905
Lesenswert?

Yalu X. schrieb:
> Von ^ gibt es in C kein logisches Äquivalent.

Das ist jetzt aber sehr pingelig :) Wenn man boolesche Datentypen nimmt 
(bool aus stdbool.h, oder einfach C++), schon. Oder halt mit "!!" vor 
dem Wert.

Bartosz B. schrieb:
> An die anderen: wozu braucht man das konkret?

z.B. bei P.D.'s Entprellroutine:
https://www.mikrocontroller.net/articles/Entprellung#Komfortroutine_.28C_f.C3.BCr_AVR.29
1
key_state ^= i;

Damit kann man einen ganzen Satz an Bits auf einmal negieren oder eben 
XOR-en.
Moderator #6131931
Lesenswert?

Programmierer schrieb:
> Yalu X. schrieb:
>> Von ^ gibt es in C kein logisches Äquivalent.
>
> Das ist jetzt aber sehr pingelig :) Wenn man boolesche Datentypen nimmt
> (bool aus stdbool.h, oder einfach C++), schon. Oder halt mit "!!" vor
> dem Wert.

In diesem Fall gibt es keinen Unterschied zwischen dem bitweisen und dem
logischen XOR, weswegen sich der logische Operator erübrigt.
#6132397
Lesenswert?

Yalu X. schrieb:
> Programmierer schrieb:
>> Yalu X. schrieb:
>>> Von ^ gibt es in C kein logisches Äquivalent.
>>
>> Das ist jetzt aber sehr pingelig :) Wenn man boolesche Datentypen nimmt
>> (bool aus stdbool.h, oder einfach C++), schon. Oder halt mit "!!" vor
>> dem Wert.
>
> In diesem Fall gibt es keinen Unterschied zwischen dem bitweisen und dem
> logischen XOR, weswegen sich der logische Operator erübrigt.

Das ist aber beim AND und OR auch nicht anders, bis darauf, dass diese 
noch eine short-circuit-evaluation machen.
Man muss für ein logisches exklusives Oder dann an Stelle von  a != b 
lieber !!a != !!b schreiben, wenn man nicht garantieren kann, dass die 
Werte nur 0 oder 1 sein können.
Gast #6135286
Lesenswert?

Dirk B. schrieb:
> Programmierer schrieb:
>> und ^ ist die bitweise Version von ...?
>
> !=

Hm, auf den ersten Blick ja. Aber ich habe so meine Zweifel.
1
( (a) != (b) )
müsste ja dann die selben Ergebnisse liefern wie
1
(!! ((!!(a)) ^ (!!(b))))
Was aber für a=4 und b=2 nicht hin kommt.
#6135369
Lesenswert?

Nick M. schrieb:
> Christian M. schrieb:
>> Ich würde jetzt sowas als %00000001 schreiben.
>
> Also ich würde nicht mal b00000001 schreiben. Ich komm bei solchen
> Zahlen noch nicht ins Trudeln. ;-)

Ich finde da auch die hexadezimale Schreibung übersichtlicher, als 
endlose Kollonen von 0en abzählen zu müssen. Wenn man mal ein bisschen 
damit gearbeitet hat, passiert die Zuordnung von Hex-Ziffern zu den 
entsprechenden Bitmustern auch ganz automatisch.
#6135376
Lesenswert?

Kann sogar auch mal in dezimal passieren, z.B. wenn man eine struct 
timespec mit Sekunden und Nanosekunden in einen einzelnen 
64-Bit-Nanosekunden-Timestamp konvertieren will:
1
my_time = ts.tv_sec * 1000000000ULL + ts.tv_nsec;
Ist das jetzt die richtige Anzahl Nullen?
Wobei ich in einem solchen Fall dann schreibe:
1
my_time = ts.tv_sec * 1000 * 1000 * 1000ULL + ts.tv_nsec;
Gast #6135399
Lesenswert?

A. K. schrieb:
> Was bei 64 Bits aber auch hex keinen Spass macht. Nett wäre z.B.
>   0x8000_0000_0000_0001

Geht ja, seit c++14:
1
cat x.c
2
#include <stdio.h>
3
int main()
4
{
5
  int a = 0b0100'0010;
6
  printf("%d\n", a);
7
}
8
$ gcc -xc++ x.c && ./a.out 
9
66

Binary nebst Separator

leo

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren