如何获得补充

时间:2011-06-29 22:55:32

标签: c#

我需要找到作为输入给出的十进制数的补码。首先,我使用以下代码将十进制数转换为二进制数,

int decNum = int.Parse(Console.ReadLine());
string binRep = " ";
int digi = 0;
do
{
    digi = decNum % 2;
    binRep = digi.ToString() + binRep;
    decNum = decNum / 2;
} while (decNum >= 1);
Console.WriteLine(binRep);

然后当我这样做时,

int onesComplement= ~(int.parse(binRep)),

我得到了奇怪的答案,例如当我给出8作为输入时,我得到1000作为二进制数,但在使用波浪号(〜)获得'补码后'我得到-1001。我想知道我在这里缺少什么,我应该做些什么才能正确地得到补充?

3 个答案:

答案 0 :(得分:5)

默认情况下,整数被解析为好像它是基数10,并且你没有指定不同的基数 - int.Parse()不提供这个。您可以使用Convert.ToInt32()代替2来指定数字所依据的基数。

  

转换字符串表示形式   指定基数中的数字   等效的32位有符号整数。

所以使用

int onesComplement= ~Convert.ToInt32(binRep, 2);

您的计划也可以缩短为:

int decNum = int.Parse(Console.ReadLine());
string binRep = Convert.ToString(decNum, 2);
Console.WriteLine(binRep);
int onesComplement = ~Convert.ToInt32(binRep, 2);
如果您不需要打印二进制输出,则

或更短:

int decNum = int.Parse(Console.ReadLine());
int onesComplement = ~decNum;

答案 1 :(得分:2)

你得到了奇怪的数字,因为当你int.Parse()时它正在使用基数10,所以它不是1000b,而是将其作为文字基数10整数1,000读取。 Int32.Parse不支持二进制数。

要解决此问题,您可以使用原始数字上的~执行按位补码,并打印这些二进制数字。

以下是对代码的略微修改,以返回32位数字的二进制表示形式,可选择反转它:

static string GetBinary(string number, bool invert)
{
    // use unsigned ints to avoid negative number problems
    uint decNum = UInt32.Parse(number);
    if (invert) decNum = ~decNum;

    string binRep = String.Empty;
    uint digi = 0;
    do
    {
        digi = decNum % 2;
        binRep = digi.ToString() + binRep;
        decNum = decNum / 2;
    } while (decNum >= 1);

    return binRep;
}

答案 2 :(得分:1)

int.Parse认为你的字符串代表一个十进制数字(1000)。