Convert.ToString()到二进制格式不能按预期工作

时间:2011-07-22 13:28:43

标签: c# binary

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 个答案:

答案 0 :(得分:33)

.NET中的负数以二进制表示为Two's complement

来自MSDN - Convert.ToString Method (Int32, Int32)

  

如果值为负且toBase为2,8或16,则返回的字符串使用两个补码表示

答案 1 :(得分:5)

表示整数 -20是11111111111111111111111111101100 系统默认使用2的Compliment。 1的赞美不适合计算。

(2的恭维是所有位加1的反转)

在2的恭维中,这将使20 +( - 20)= 0,可以轻松地计算数学而无需担心正面或负面。

例如,在signed char中: 15 = 00001111, -18 = 2的赞美(00010010)= 11101101 + 1 = 11101110

00001111 11101110 = 11111101

由于第一位为1,我们知道它是负值。 让我们做一个反向2的赞美。

11111101 - 1 = 11111100 => - (00000011)它给出-3其中15 +( - 18)= -3

答案 2 :(得分:3)

int value = 31;
string binary = Convert.ToString(value, 2);
Console.WriteLine(binary.PadLeft(8, '0'));          // Outputs "00011111"

答案 3 :(得分:3)

这与其他人发布的答案基本相同,只是打包在方法中。

  /// <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');
  }

答案 4 :(得分:0)

如果您要摆脱这种“效果” - 使用Math.Abs()方法获取没有数字的数字值,

string output = Convert.ToString(Math.Abs(i), 2); // Base2 

答案 5 :(得分:0)

此功能完全符合您的要求

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);
}

答案 6 :(得分:0)

这是我写的一个例程,它完成了原始提问者想要的内容。仅仅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;
}