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