如何获得;补足
本文关键字:补足 何获得 | 更新日期: 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)。