Существует ли функция C #, которая форматирует 64-битное значение «без знака» в его эквивалентное двоичное значение? - PullRequest
14 голосов
/ 08 августа 2011

Чтобы отформатировать / отобразить число в его эквивалентной двоичной форме (в C #), я всегда просто вызывал:

Convert.ToString(myNumber, 2);

Сегодня я только что понял, что перегрузка .ToString (), которой я былВызов не поддерживает значения, которые больше, чем 9223372036854775807. Обратите внимание, подпись перегрузки .ToString (): .ToString(long, int).Где "long" - это 64-битное значение со знаком, максимальное значение которого равно 9223372036854775807.

Иными словами, используя C #, при запуске:

Convert.ToString(9223372036854775808,2);

Не удивительно (из-за подписи), что я получаю это сообщение об исключении:

Наилучшее совпадение перегруженного метода для 'System.Convert.ToString (object, System.IFormatProvider)' имеет недопустимые аргументы -Аргумент 2: невозможно преобразовать из 'int' в 'System.IFormatProvider'

Мой вопрос: существует ли функция .NET, которая позволяет преобразовывать значения, превышающие 9223372036854775807, в их эквивалентный двоичный формат?

Ответы [ 2 ]

25 голосов
/ 08 августа 2011

Вы можете назвать его без знака или со знаком, но это то же самое, если вы посмотрите на него побитово!

Так что если вы сделаете это:

Convert.ToString((long)myNumber,2);

вы получите те же биты, что ивы бы сделали, если бы была реализована длинная реализация Convert.ToString (), и поэтому ее нет ...;)

Следовательно, ((long)-1) и ((ulong)-1) выглядят одинаково в памяти.

2 голосов
/ 08 августа 2011

К сожалению, прямого эквивалента .NET, такого как Convert.ToString (ulong, int), нет.Вы должны будете сделать свое собственное, как следующее:

public static string ConvertToBinary(ulong value){
  if(value==0)return "0";
  System.Text.StringBuilder b=new System.Text.StringBuilder();
  while(value!=0){
    b.Insert(0,((value&1)==1) ? '1' : '0');
    value>>=1;
  }
  return b.ToString();
}
...