Nein nein, ich selbst habe deinen Failtrain ganz grandios fortgesetzt,
in dem ich abwechselnd in & und | gedacht habe
(was Failtrain, macht doch nichts
Deswegen wird hier diskutiert, damit wir uns gegenseitig ausbessern...)
Die (jetzt hoffentlich) korrekte Antwort ist:
Wenn man ganz sicher gehen will kann man diese Frage nicht beantworten,
weil der Standard hier etwas nicht regelt.
Wenn man das als Gegeben nimmt, was Compiler tun:
Das if wird nur dann ausgeführt, wenn value 1 ist. Sonst nie.
8 Stück Vorwissen für den Beweis
In C, C++ (und noch einigen anderen Sprachen) gilt die Zahl 0 als Falsch bzw. Nein
und jede andere Zahl (egal ob positiv oder negativ) als Wahr bzw. Ja.
Ein if kann die Bedingung drin nicht wirklich auswerten,
sondern die Bedingung ist eigentlich eine Rechnung, die am Ende 0 oder nicht ergibt.
== und Ähnliches Verrechnen zwei Zahlen genauso wie + und -
Nach Verrechnen der Bedingung hat man entweder if(0), das wird nicht ausgeführt,
oder eine andere Zahl, dann wird der Codeblock ausgeführt.
Der Operator == für je eine Zahl links und rechts hat eine einzelne Zahl als Ergebnis,
so wie + auch aus zwei Zahlen eine macht. Klar.
Die Frage ist, welchen Wert.
Wenn die zu vergleichenden Zahlen nicht gleich sind ergibt das Ganze 0 für Falsch,
das ist immer so. Wenn die Zahlen aber gleich sind wäre jeder Wert außer 0 gültig für Wahr
Wenn einfach sowas wie "if(==b)" dasteht ist egal, welcher konkrete Wahrwert rauskommt,
das if wird immer ausgeführt. Wenn man aber mit dem Wert math. weiterrechnen will...
Das ist die Sache, die im Standard nicht festgelegt ist.
Übliche Compiler nehmen hier 1 für Wahr, aber 2 oder 255 oder -1 oder ... wären auch erlaubt.
Die Ausgangsfrage kann man konkret beantworten, wenn man 1 annimmt,
aber nicht pauschal für jede Zahl.
Also, eigentlich unbeantwortbar, aber ich nehme 1 an.
Das logische Und "&&" ergibt dann Wahr,
wenn beide zu verrechnenden Werte Wahr (nicht Null) sind.
Insgesamt, über das ganze int/char...
Bitschreibweise:
01011110 &&
11010010 =
00000001
weil NichtNull && NichtNull
(hier gilt wieder die Annahme, das ein generierte Wahr genau 1 ist)
Das binäre Und "&" macht das Selbe pro Bit der Zahlen.
01011110 &
11010010 =
01010010
Nur, wenn beide Bits auf einer Stelle 1 sind ist das Ergebnisbit auch 1.
Mathematische Klammern () werden auf jeden Fall beachtet,
egal ob in Rechnungen oder if´s.
Reihenfolge der Abarbeitung von Operatoren, wenn keine Klammern da sind:
Es gibt Tabellen zum Nachschauen.
+ wäre vor == dran (zum Beispiel), aber:
& kommt nach ==
(falls es nicht passend geklammert wurde)
-------
Um auf die Ausgangsfrage zurückzukommen:
if(value & (value-1) == 0)
a) value ist 1 (ich behaupte, nur dann gehts)
if(value & (value-1) == 0)
if(1 & (1-1) == 0)
if(1 & (0) == 0)
if(1 & 0 == 0)
if(1 & 1)
Binär:
if(00000001 & 00000001)
if(00000001)
Dezimal:
if(1)
Wahr, wird ausgeführt
b) value ist nicht 1
if(value & (value-1) == 0)
if(value & (
nichtnull) == 0)
if(value & 0)
Jedes Bit "und falsch" ist pro Bit immer Falsch (0)
Binär alles Nuller ist dezimal auch 0...
if(0)
Falsch