Convert.ToString() в двоичном формате не работает как ожидалось
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?
Ответы
Ответ 1
Отрицательные числа в .NET представлены в двоичном виде как Два дополнения.
От MSDN - Метод Convert.ToString(Int32, Int32):
Если значение отрицательное, а toBase - 2, 8 или 16, возвращаемая строка использует два представления представления
Ответ 2
для целых чисел
-20 - 11111111111111111111111111101100
По умолчанию система использует 2 комплимента.
1 Комплимент не идеален для расчета.
(2 комплимента инвертируют все бит плюс один)
в 2 Комплимент, который сделает 20 + (-20) = 0, может легко вычислить математику без положительного или отрицательного результата.
например, в подписанном char:
15 = 00001111,
-18 = 2 Комплимент (00010010) = 11101101 + 1 = 11101110
00001111
+11101110
= 11111101
Поскольку первый бит равен 1, мы знаем, что это отрицательное значение.
Пусть сделают обратный 2 комплимента.
11111101 - 1 = 11111100 = > - (00000011) он дает -3, который 15 + (-18) = -3
Ответ 3
int value = 31;
string binary = Convert.ToString(value, 2);
Console.WriteLine(binary.PadLeft(8, '0')); // Outputs "00011111"
Ответ 4
Это в основном тот же ответ, что и все остальные, только что упакованные в метод.
/// <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 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');
}
Ответ 5
Если вы избавитесь от этого "эффекта" - используйте метод Math.Abs()
, чтобы получить числовое значение без знака,
string output = Convert.ToString(Math.Abs(i), 2); // Base2
Ответ 6
Эта функция делает именно то, что вы хотите
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);
}
Ответ 7
Вот рутина, которую я написал, которая делает то, что хотел первоначальный вопросник. Прошло всего 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;
}