4 Stimmen

Ich verstehe die folgende C-Codezeile nicht

Ich habe den folgenden Thread gefunden:
Berechnen der Broadcast-Adresse aus IP und Subnetzmaske und dort den Link zu http://lpccomp.bc.ca/netmask/netmask.c

Kann mir bitte jemand die folgende Zeile erklären, ich verstehe sie nicht:

for ( maskbits=32 ; (mask & (1L<<(32-maskbits))) == 0 ; maskbits-- )

insbesondere mask & (1L<<(32-maskbits))

7voto

Péter Török Punkte 111735

<< ist die bitweiser Linksschiebe-Operator ; sie verschiebt die Bits eines Wertes um den angegebenen Betrag nach links. So 1L<<(32-maskbits) verschiebt den Wert um 1 nach links 32-maskbits Zeiten.

& ist die bitweiser AND-Operator .

Der Schleifenausdruck mask & (1L<<(32-maskbits)) == 0 prüft alle Bits innerhalb des Wertes von mask , von unten nach oben. Die Schleife stoppt beim ersten (niedrigsten) Nicht-Null-Bit von mask zu welchem Zeitpunkt maskbits enthält die Anzahl der Bits über (und einschließlich) diesem Bit.

z.B.

  • wenn mask == 0xFFFF mask == 0xFFFFFFFF (== binary 11111111111111111111111111111111) wird die Schleife bei der ersten Iteration angehalten, und maskbits wird 32 sein
  • wenn mask == 0x0001 mask == 0x00000001 (== binary 00000000000000000000000000000001) wird die Schleife wieder bei der ersten Iteration angehalten, und maskbits wird 32 sein
  • wenn mask == 0x1000 mask == 0x01000000 (== binary 00000001000000000000000000000000) wird die Schleife bei der 24. Iteration angehalten, und maskbits wird 8

1voto

WOPR Punkte 5117

Sehen Sie sich die bitweisen Operatoren an, insbesondere die Linksverschiebung.

http://en.wikipedia.org/wiki/Bitwise_operation#Shifts_in_C.2C_C.2B.2B_and_Java

1voto

dierre Punkte 7020

Um zu sehen, was passiert: Führen Sie es aus.

#include <stdio.h> 
#include <iostream>
using namespace std;

char *binary (unsigned int v) {
static char binstr[33] ;
int i ;

binstr[32] = '\0' ;
for (i=0; i<32; i++) {
binstr[31-i] = v & 1 ? '1' : '0' ;
v = v / 2 ;
}

return binstr ;
}

int main(void){  

  unsigned long maskbits,mask;  

mask = 0x01000000;
cout << "MASK IS: " << binary(mask) << "\n";
cout << "32 is: " << binary(32) << "\n\n";
for ( maskbits=32 ; (mask & (1L<<(32-maskbits))) == 0 ; maskbits-- ) {
cout << "maskbits: " << binary(maskbits) << "\n";
cout << "\t(32-maskbits): " << binary((32-maskbits)) << "\n";
cout << "\t1L<<(32-maskbits): " << binary((1L<<(32-maskbits))) << "\n";
cout << "\t(mask & (1L<<(32-maskbits))): " << binary((mask & (1L<<(32-maskbits)))) << "\n\n";

}

cout << "\nFinal maskbits: " << maskbits;

return 0;
}

http://ideone.com/eB8Kp

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X