我找到了以下线程:
从 ip 和子网掩码计算广播地址以及指向http://lpccomp.bc.ca/netmask/netmask.c的链接
有人可以解释以下行,我不明白:
for ( maskbits=32 ; (mask & (1L<<(32-maskbits))) == 0 ; maskbits-- )
尤其mask & (1L<<(32-maskbits))
我找到了以下线程:
从 ip 和子网掩码计算广播地址以及指向http://lpccomp.bc.ca/netmask/netmask.c的链接
有人可以解释以下行,我不明白:
for ( maskbits=32 ; (mask & (1L<<(32-maskbits))) == 0 ; maskbits-- )
尤其mask & (1L<<(32-maskbits))
<<
是按位左移运算符;它将值的位向左移动给定的数量。因此1L<<(32-maskbits)
将值 1 向左移动32-maskbits
次数。
&
是按位与运算符。
所以循环表达式mask & (1L<<(32-maskbits)) == 0
测试 的值内的所有位mask
,从低到高。循环将在 的第一个(最低)非零位上停止mask
,此时maskbits
将包含高于(包括)该位的位数。
例如
mask == 0xFFFF
mask == 0xFFFFFFFF (== binary 11111111111111111111111111111111)
maskbits
mask == 0x0001
mask == 0x00000001 (== binary 00000000000000000000000000000001)
maskbits
mask == 0x1000
mask == 0x01000000 (== binary 00000001000000000000000000000000)
maskbits
要查看发生了什么:运行它。
#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;
}