Подтвердить что ты не робот

Есть ли функция С#, которая форматирует 64-битное значение "Без знака" для его эквивалентного двоичного значения?

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

Convert.ToString(myNumber, 2);

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

Другими словами, используя С#, когда я запускаю это:

Convert.ToString(9223372036854775808,2);

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

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

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

4b9b3361

Ответ 1

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

Итак, если вы это сделаете:

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

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

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

Ответ 2

К сожалению, нет прямого эквивалента .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();
}

Ответ 3

public static string UInt64ToBinary(UInt64 input)
{
    UInt32 low = (UInt32) (input & 0xFFFFFFFF);
    UInt32 high = (UInt32) (input & 0xFFFFFFFF00000000) >> 32;
    return $"{Convert.ToString(high, 2)}{Convert.ToString(low, 2)}";
}