如何获得;补足

本文关键字:补足 何获得 | 更新日期: 2023-09-27 18:00:48

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

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作为二进制数,但在使用波浪号(~)获得1的补码后,我得到-1001。我想知道我在这里缺少了什么,我应该做什么才能正确地得到一的补码?

如何获得;补足

默认情况下,整数被解析为以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;

你得到的是奇怪的数字,因为当你做int.Parse()时,它使用的是基数10,所以它读取的不是1000b,而是10整数1000。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;
}

int.Parse认为您的字符串表示十进制数(1000)。