Convert.ToString () в двоичный формат не работает должным образом - PullRequest
13 голосов
/ 22 июля 2011
int i = 20;
string output = Convert.ToString(i, 2); // Base2 formatting
i = -20;
output = Convert.ToString(i, 2);
Value   Expected                            Actual
20      00000000000000000000000000010100    10100
-20     10000000000000000000000000010100    11111111111111111111111111101100

Я вижу, что, возможно, двоичный вывод 20 был усечен, но я не понимаю вывод для -20.Я основывал свои ожидания на нотации base2 плюс убеждение, что подписанный элемент целого числа был выражен в первой самой левой цифре.0 для положительного и 1 для отрицательного.Может кто-нибудь объяснить результаты, в частности, -20?

Ответы [ 7 ]

33 голосов
/ 22 июля 2011

Отрицательные числа в .NET представлены в двоичном виде как Дополнение до двух .

Из MSDN - Метод Convert.ToString (Int32, Int32) :

Если значение отрицательное и toBase равно 2, 8 или 16, возвращаемая строка использует представление дополнения до двух

5 голосов
/ 17 августа 2013

для целого -20 равно 11111111111111111111111111101100 Система использует комплимент 2 по умолчанию.Комплимент 1 не идеален для вычисления.

(комплимент 2 инвертирует все биты плюс один)

в комплименте 2, что составит 20 + (-20) = 0, может вычислить математикулегко, без беспокойства, положительный или отрицательный.

например, в знаке с символом: 15 = 00001111, -18 = 2's Compliment (00010010) = 11101101 + 1 = 11101110

00001111 +11101110 = 11111101

Поскольку первый бит равен 1, мы знаем, что это отрицательное значение.Давайте сделаем комплимент в обратном порядке.

11111101 - 1 = 11111100 => - (00000011) он дает -3, что 15 + (-18) = -3

3 голосов
/ 15 января 2017

Это в основном тот же ответ, что и все остальные, только что упакованный в метод.

  /// <summary>
  /// Method to convert an integer to a string containing the number in binary. A negative 
  /// number will be formatted as a 32-character binary number in two's compliment.
  /// </summary>
  /// <param name="theNumber">self-explanatory</param>
  /// <param name="minimumDigits">if binary number contains fewer characters leading zeros are added</param>
  /// <returns>string as described above</returns>
  public static string IntegerToBinaryString(int theNumber, int minimumDigits)
  {
     return Convert.ToString(theNumber, 2).PadLeft(minimumDigits, '0');
  }
3 голосов
/ 12 мая 2012
int value = 31;
string binary = Convert.ToString(value, 2);
Console.WriteLine(binary.PadLeft(8, '0'));          // Outputs "00011111"
0 голосов
/ 02 ноября 2016

Вот подпрограмма, которую я написал, которая делает то, что хотел оригинальный спрашивающий. Уже на 5 лет позже!

/// <summary>Convert a number into a string of bits</summary>
/// <param name="value">Value to convert</param>
/// <param name="minBits">Minimum number of bits, usually a multiple of 4</param>
/// <exception cref="InvalidCastException">Value must be convertible to long</exception>
/// <exception cref="OverflowException">Value must be convertible to long</exception>
/// <returns></returns>
public static string ShowBits<T>(this T value, int minBits)
{
    long x = Convert.ToInt64(value);
    string retVal = Convert.ToString(x, 2);
    if (retVal.Length > minBits) retVal = Regex.Replace(retVal, @"^1+", "1");   // Replace leading 1s with a single 1 - can pad as needed below
    if (retVal.Length < minBits) retVal = new string(x < 0 ? '1' : '0', minBits - retVal.Length) + retVal;  // Pad on left with 0/1 as appropriate
    return retVal;
}
0 голосов
/ 06 июля 2014

Эта функция делает именно то, что вы хотите

string ConvertToFuzzyFrogBinary(int input)
{
    int prefix = (input).ToString("d8").Length-(Math.Abs((input))).ToString("d8").Length;
    string binary_num = "00000000000000000000000000000000".Substring(0,32-Convert.ToString(Math.Abs(input),2).Length)+Convert.ToString(Math.Abs(input),2);
    return "1".Substring(0,prefix)+binary_num.Substring(prefix,32-prefix);
}
0 голосов
/ 22 июля 2011

Если вы хотите избавиться от этого «эффекта» - используйте метод Math.Abs(), чтобы получить числовое значение без знака,

string output = Convert.ToString(Math.Abs(i), 2); // Base2 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...