我需要找到作为输入给出的十进制数的补码。首先,我使用以下代码将十进制数转换为二进制数,
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。我想知道我在这里缺少什么,我应该做些什么才能正确地得到补充?
答案 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)。