4

次のスレッドを見つけました
。IPとサブネットマスクからブロードキャストアドレスを計算し、そこにhttp://lpccomp.bc.ca/netmask/netmask.cへのリンクを見つけました。

誰かが次の行を説明してもらえますか、私にはわかりません:

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

特にmask & (1L<<(32-maskbits))

4

3 に答える 3

7

<<ビット単位の左シフト演算子です; 値のビットを指定された量だけ左にシフトします。したがって1L<<(32-maskbits)、値1を左にシフトします32-maskbits

&ビットごとのAND演算子です。

したがって、ループ式mask & (1L<<(32-maskbits)) == 0は、値内のすべてのビットmaskを低いものから高いものへとテストします。ループは、の最初の(最も低い)非ゼロビットで停止します。maskその時点で、maskbitsそのビットより上の(およびそれを含む)ビット数が含まれます。

例えば

  • の場合、ループは最初の反復で停止し、32になりますmask == 0xFFFF mask == 0xFFFFFFFF (== binary 11111111111111111111111111111111)maskbits
  • の場合、ループは最初の反復で再び停止し、32になりますmask == 0x0001 mask == 0x00000001 (== binary 00000000000000000000000000000001)maskbits
  • の場合、ループは24回目の反復で停止し、8になりますmask == 0x1000 mask == 0x01000000 (== binary 00000001000000000000000000000000)maskbits
于 2010-08-26T10:10:02.057 に答える
1

何が起こっているかを確認するには、それを実行します。

#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

于 2010-08-26T11:04:00.610 に答える
1

ビット演算子、特に左シフトを見てください。

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

于 2010-08-26T10:09:39.920 に答える