Сериализуйте логическое значение «1» и «0» вместо «true» и «false»

Решение состоит в использовании 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. Кстати, это довольно ценное решение для этого вопроса .

11
задан Matthieu Napoli 14 June 2011 в 08:34
поделиться