简体   繁体   中英

I don't understand the following C code line

I found the following thread:
Calculate broadcast address from ip and subnet mask and there the link to http://lpccomp.bc.ca/netmask/netmask.c

Could someone please explain the following line, I don't understand:

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

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

<< is the bitwise left shift operator ; it shifts the bits of a value left by the given amount. Thus 1L<<(32-maskbits) shifts the value 1 to the left 32-maskbits times.

& is the bitwise AND operator .

So the loop expression mask & (1L<<(32-maskbits)) == 0 tests all the bits within the value of mask , from lower to higher. The loop will stop on the first (lowest) nonzero bit of mask , at which point maskbits will contain the number of bits above (and including) that bit.

Eg

  • if mask == 0xFFFF mask == 0xFFFFFFFF (== binary 11111111111111111111111111111111) , the loop will stop on the first iteration, and maskbits will be 32
  • if mask == 0x0001 mask == 0x00000001 (== binary 00000000000000000000000000000001) , the loop will again stop on the first iteration, and maskbits will be 32
  • if mask == 0x1000 mask == 0x01000000 (== binary 00000001000000000000000000000000) , the loop will stop on the 24th iteration, and maskbits will be 8

Have a look at bitwise operators, specifically left shift.

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

To see what's happening: run it.

#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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM