<<
является 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
вопрос: Я получаю поразрядный операцию, чтобы проверить, когда остановить биты подсчета, я не понимаю, почему с помощью левой сдвигая с длинным междунар. '1' было недостаточно? – dierre
спасибо за объяснение! – mspoerr
@ dierre, чтобы избежать переполнения целого числа. На некоторых платформах «int» имеет длину всего 16 бит, где, если вы оставили сдвиг любого значения «int» более чем на 16, результат не определен (может быть 0). Объявление значения как 'long' гарантирует, что оно имеет длину не менее 32 бит. –