2010-08-26 4 views

ответ

6

<< является bitwise left shift operator; он сдвигает бит значения, оставшегося на заданную величину. Таким образом, 1L<<(32-maskbits) сдвигает значение 1 влево 32-maskbits раз.

& является bitwise AND operator.

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

E.g.

  • если 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
+0

вопрос: Я получаю поразрядный операцию, чтобы проверить, когда остановить биты подсчета, я не понимаю, почему с помощью левой сдвигая с длинным междунар. '1' было недостаточно? – dierre

+0

спасибо за объяснение! – mspoerr

+1

@ dierre, чтобы избежать переполнения целого числа. На некоторых платформах «int» имеет длину всего 16 бит, где, если вы оставили сдвиг любого значения «int» более чем на 16, результат не определен (может быть 0). Объявление значения как 'long' гарантирует, что оно имеет длину не менее 32 бит. –

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

+0

Благодарю вас за отличный пример! – mspoerr

Смежные вопросы