Решение состоит в том, чтобы использовать binary operation
как
foreach(string octet in ipAddress.Split('.'))
{
int oct = int.Parse(octet);
while(oct !=0)
{
total += oct & 1; // {1}
oct >>=1; //{2}
}
}
Хитрость в том, что в строке {1} binary AND
имеет значение умножение , поэтому умножаем 1x0=0
, 1x1=1
. Так что, если у нас есть гипотетическое число
0000101001
и умножим его на 1
(поэтому в двоичном мире мы выполняем &), что не больше, чем 0000000001
, мы получаем
0000101001
0000000001
Большинство вправо цифра равна 1
в обоих числах, поэтому binary AND
возвращает 1
, в противном случае, если ЛЮБОЙ из младшей цифры номера будет 0
, результат будет 0
.
Итак, здесь, в строке total += oct & 1
мы добавляем к tolal
либо 1
, либо 0
, основываясь на этом цифровом номере.
В строке {2} вместо этого мы просто сдвигаем младший бит вправо, фактически, делив число на 2
, пока оно не станет 0
.
Easy.
РЕДАКТИРОВАТЬ
Это действительно для intgere
и byte
типов, но не используйте эту технику на floating point
числах. Кстати, это очень ценное решение для этого вопроса.