Решение состоит в использовании 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
(так что в бинарном мире мы выполняем & amp;), что еще не так 0000000001
, получаем
0000101001
0000000001
Наиболее правая цифра - 1
в обоих числах, поэтому binary AND
возвращает 1
, в противном случае, если ЛЮБОЙ младший разряд чисел будет 0
, результатом будет 0
.
Итак, здесь, в строке total += oct & 1
, мы добавим к tolal
либо 1
, либо 0
, на основе этого числа digi.
В строке {2} вместо этого мы просто смещаем бит minor вправо, фактически, деля число на 2
, пока оно не станет 0
.
Легко.
EDIT
Это допустимо для типов intgere
и для byte
, но не используйте эту технику на номерах floating point
. Кстати, это довольно ценное решение для этого вопроса .