Ich arbeitete an einem Algorithmus von Untersequenzen.
Was bedeutet die Aussage:
if (counter & (1<<j))
im Rahmen des nachstehenden Programms:
void printSubsequences(int arr[], int n)
{
unsigned int opsize = pow(2, n);
for (int counter = 1; counter < opsize; counter++)
{
for (int j = 0; j < n; j++)
{
if (counter & (1<<j))
cout << arr[j] << " ";
}
cout << endl;
}
}
Die Aussage:
if (counter & (1<<j))
überprüft, ob die j
-tes Stück von counter
eingestellt ist. Genauer, 1 << j
verwendet Verschiebung von 1
um eine Bitmaske zu erzeugen, in der nur die j
-te Bit ist gesetzt. Das &
Operator maskiert dann die j
-ein bisschen counter
; wenn das Ergebnis nicht Null ist (was bedeutet, dass die j
-tes Stück von counter
gesetzt wurde), ist die Bedingung erfüllt.
Betrachten Sie das folgende Beispiel. Wenn counter
ist 320, seine binäre Darstellung ist 101000000
, was bedeutet, dass das 6. Bit (dasjenige, das dem Wert 64 entspricht) gesetzt ist; Lassen Sie uns für dieses Bit testen. Die Bitmaske wird durch Verschieben erzeugt 1
die die binäre Darstellung hat 000000001
6 Stellen nach rechts, was den Binärwert ergibt 001000000
. Der Wert von counter
nämlich:
101000000
kombiniert wird mit &
das ist der bitweise Und-Operator, mit der Bitmaske wie folgt:
101000000
& 001000000
---------
001000000
Der Wert 001000000
entspricht wieder dem Wert von 64; Dies ist hier jedoch nicht wichtig, es ist nur wichtig, dass es nicht Null ist (da es ein Nicht-Null-Bit hat, nämlich das Bit, auf das wir prüfen wollten). Insgesamt der Zustand
if ( 64 )
ist befriedigt. In der Semantik von C (das keinen nativen booleschen Datentyp aufweist) wird jeder Wert ungleich Null als wahr behandelt, wenn er überprüft wird if
.
—Erster For-Schleifenlauf i=0 bis i<8 .(Erklärung - https://www.geeksforgeeks.org/power-set/)
—Zweiter Schleifenlauf i=0 bis i<3 (für {a,b,c})
1. Nehmen wir für die erste Schleife i = 0:
j=0,1,2 in this case (0 & (1<<0)),(0 & (1<<1)),(0 & (1<<2))
But 0 with & is always 0 so all instance are false for first loop.
-
Nehmen wir für die zweite Schleife i=1:
j=0 In diesem Fall (1 & (1<<0)) ist es wahr, also j=0 und arr[0]= ein Druck.
j=1,2 sind falsch, weil ( 1 & (1<<1)) & (1 & (1<<2)) falsch sind.
-
Nehmen wir für die zweite Schleife i=2:
j=1, in diesem Fall (2 & (1<<1)) ist es wahr, also j=1 und arr[1]= b drucken.
j=0,2 sind falsch, weil ( 2 & (1<<0)) & (2 & (1<<2)) falsch sind.
-
Nehmen wir für die zweite Schleife i=3:
j=0,2 int diesem Fall (3 & (1<<2)) & (3 & (1<<2)) es ist wahr also j=0,2 und arr[2] =a & c drucken.
j=1 sind falsch, weil ( 3 & (1<<1)) falsch sind.
-
Nehmen wir für die zweite Schleife i=4:
j=2 In diesem Fall (4 & (1<<2)) ist es wahr, also j=2 und arr[2] =c drucken.
j=0,1 sind falsch, weil ( 4 & (1<<0)) & (4 & (1<<1)) falsch sind.
Das geht also weiter…..
<<
bedeutet, dass der linke Operand so oft mit 2 multipliziert wird wie die Zahl im rechten Operanden. Z.B1 << 3
meint1*2*2*2
.– MM
13. Januar 2017 um 7:42 Uhr
Das
counter & (stuff)
ergibt ein bitweiseAND
voncounter
undstuff
– David C. Rankin
13. Januar 2017 um 7:45 Uhr
Was sind bitweise Verschiebungsoperatoren (bit-shift) und wie funktionieren sie?
– phuklv
13. Januar 2017 um 7:47 Uhr