В соответствии с документами для v0.18.0 , если вы работаете на терминале (то есть не в iPython notebook, qtconsole или IDLE), это 2-лайнер, чтобы Pandas автоматически обнаруживал ваши ширина экрана и адаптироваться «на лету» с указанием количества столбцов:
pd.set_option('display.large_repr', 'truncate')
pd.set_option('display.max_columns', 0)
Алгоритм подсчета бит, взятый из: 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);
Был использован самый простой алгоритм из статьи. Если производительность критическая, вы можете прочитать статью и использовать более оптимизированное решение.
Полный образец:
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
}
Вы можете преобразовать число в двоичный файл следующим образом:
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;
Решение состоит в использовании 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
. Кстати, это довольно ценное решение для этого вопроса .
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;