Я не понимаю следующую строку кода C - PullRequest
4 голосов
/ 26 августа 2010

Я нашел следующую ветку:
Рассчитать широковещательный адрес из ip и маски подсети и там ссылка на http://lpccomp.bc.ca/netmask/netmask.c

Может кто-нибудь объяснить, пожалуйста, следующую строкуЯ не понимаю:

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

особенно mask & (1L<<(32-maskbits))

Ответы [ 3 ]

6 голосов
/ 26 августа 2010

<< - оператор сдвига влево ;это сдвигает биты значения, оставленного данной величиной.Таким образом, 1L<<(32-maskbits) сдвигает значение 1 влево 32-maskbits раз.

& является оператором поразрядным И .

Таким образом, выражение цикла mask & (1L<<(32-maskbits)) == 0проверяет все биты в пределах значения mask, от меньшего к большему.Цикл остановится на первом (самом низком) ненулевом бите mask, в котором точка maskbits будет содержать количество бит выше (и включая) этот бит.

Например,

  • если mask == 0xFFFF mask == 0xFFFFFFFF (== binary 11111111111111111111111111111111), цикл остановится на первой итерации, и maskbits составит 32
  • , если mask == 0x0001 mask == 0x00000001 (== binary 00000000000000000000000000000001), цикл снова остановится на первой итерации, и maskbits будет равен 32
  • , если mask == 0x1000 mask == 0x01000000 (== binary 00000001000000000000000000000000), цикл остановится на 24-й итерации, иmaskbits будет 8
1 голос
/ 26 августа 2010

Чтобы увидеть, что происходит: запустите его.

#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

1 голос
/ 26 августа 2010

Посмотрите на побитовые операторы, особенно на левое смещение.

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

...