Was wird hier gemacht?

Gast #2595041
Lesenswert?

(i & 1) dient einer Gerade oder Ungerade unterscheidung.

for (i = 0; i < 10 * 1024; ++i) {
         if (i & 1) {                              wenn i gerade
             ptr[i] = 0x55AA55AA | (1 << i);       dann das hier
         }
         else {
             ptr[i] = 0xAA55AA55 | (1 << i);       sonst das hier
         }

Aber da i ja als Maximalwert 10*1024=10240 erreichen kann denke ich das
"(1 << i);" nicht wirklich gut funktioniert. Eine Schiebeoperation um 
10240 Stellen ist sicherlich nicht von Erfolg gekrönt wenn danch mit 
einer 32 Bit Zahl eine Oder Operation durchgefüht wird.
#2595128
Lesenswert?

Uwe schrieb:
> for (i = 0; i < 10 * 1024; ++i) {
>          if (i & 1) {                              wenn i gerade
>              ptr[i] = 0x55AA55AA | (1 << i);       dann das hier
>          }
>          else {
>              ptr[i] = 0xAA55AA55 | (1 << i);       sonst das hier
>          }

Wenn i = 1 bzw 2 ist:
Es wird bitweise und-Verknüpft, also :
1
   i=1         i=2
2
  0...001     0...010
3
& 0...001   & 0...001
4
---------   ---------
5
  0...001     0...000
Also, wenn i = 1 ist, kommt true raus und er geht ins if. Wenn i = 2 
ist, kommt 0 raus, also false, somit geht er "ins" else. Somit sind die 
"Kommentare" da oben falsch. Er geht ins if, wenn i ungerade ist und ins 
else, wenn i gerade ist.

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