Преобразование сетевой маски в длину префикса [дубликат]

В соответствии с документами для v0.18.0 , если вы работаете на терминале (то есть не в iPython notebook, qtconsole или IDLE), это 2-лайнер, чтобы Pandas автоматически обнаруживал ваши ширина экрана и адаптироваться «на лету» с указанием количества столбцов:

pd.set_option('display.large_repr', 'truncate')
pd.set_option('display.max_columns', 0)

3
задан QuietLeni 3 January 2012 в 13:23
поделиться

5 ответов

Алгоритм подсчета бит, взятый из: http://www.necessaryandsufficient.net/2009/04/optimising-bit-counting-using-iterative-data-driven-development/

string mask = "255.255.128.0";
int totalBits = 0;
foreach (string octet in mask.Split('.'))
{
    byte octetByte = byte.Parse(octet);
    while (octetByte != 0)
    {
        totalBits += octetByte & 1;     // logical AND on the LSB
        octetByte >>= 1;            // do a bitwise shift to the right to create a new LSB
    }                
}
Console.WriteLine(totalBits);

Был использован самый простой алгоритм из статьи. Если производительность критическая, вы можете прочитать статью и использовать более оптимизированное решение.

3
ответ дан Rotem 5 September 2018 в 10:19
поделиться

Полный образец:

public int CountBit(string mask)
        {

            int ones=0;
            Array.ForEach(mask.Split('.'),(s)=>Array.ForEach(Convert.ToString(int.Parse(s),2).Where(c=>c=='1').ToArray(),(k)=>ones++));
          return ones

        }
0
ответ дан Felice Pollano 5 September 2018 в 10:19
поделиться

Вы можете преобразовать число в двоичный файл следующим образом:

        string ip = "255.255.128.0";
        string[] tokens = ip.Split('.');
        string result = "";
        foreach (string token in tokens)
        {
            int tokenNum = int.Parse(token);
            string octet = Convert.ToString(tokenNum, 2);
            while (octet.Length < 8)
                octet = octet + '0';
            result += octet;
        }
        int mask = result.LastIndexOf('1') + 1;
0
ответ дан juergen d 5 September 2018 в 10:19
поделиться

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

0
ответ дан Tigran 5 September 2018 в 10:19
поделиться
string ip = "255.255.128.0";
string a = "";
ip.Split('.').ToList().ForEach(x => a += Convert.ToInt32(x, 2).ToString());
int ones_found = a.Replace("0", "").Length;
1
ответ дан Tomislav Markovski 5 September 2018 в 10:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: