从二进制补码转换为十进制

时间:2014-01-25 22:30:05

标签: c++ bit-manipulation bit base

您可能熟悉有符号整数的二进制补码表示。它是当今最广泛使用的二进制整数表示。鲜为人知的是二进制整数表示的其他一些建议,包括基数-2。 Base -2具有二进制补码的算术便利性,可能更容易描述。 (见http://en.wikipedia.org/wiki/Signed_number_representations

示例:1011是1 *( - 2)^ 3 + 0 *( - 2)^ 2 + 1 *( - 2)^ 1 + 1 *( - 2)* 0 = -8 + 0 + - 2 + 1 = -9

输入

第一个数字T(从1到100)是从基数-2转换为基数10的整数数。

下一个T号是基数-2(每个1到15位)。

注意:数字可以在左边填充0。

输出

输出数字的带符号的基数10表示,用空格分隔。


以下是我在C ++中的代码;它几乎只是使用上面的例子中的方法与1011.它在我自己的测试用例中工作正常,但是当我在在线评判中提交它时,它给出了错误的答案。我认为可能会溢出。有关如何改进我的代码的任何建议。谢谢!

#include<iostream>
#include<math.h>
using namespace std;
long long int convert (long long int base, long long int num){
long long int exp=0;
long long int output=0;
while (num != 0){
    long long int digit = num - 10*int(num/10);
    output += digit * pow(base, exp);
    exp++;
    num = int(num/10);


}
return output;
}
int main(){
int cases;
cin >> cases;
long long int input;
long long int base = -2;
cin >> input;
cout << convert(base, input); 
for (int i=1; i< cases; i++){
    cin >> input;
    cout << " " << convert(base, input);
}

return 0;
}

2 个答案:

答案 0 :(得分:2)

数字是一个可以用手指表达的抽象概念。

Arithmetics以不同的方式指示该抽象数字的表示,称为编号系统。

因此,如果您更喜欢,可以将数字映射到一串数字或一系列数字。

您定义的函数转换,取一个数字和一个基数并将其转换为数字。因此,它不会将该数字表示为数字序列。

答案 1 :(得分:2)

正如你所说,最好的想法是阅读这个问题:

“第一个数字T(从1到100)是从基数-2转换为基数10的整数数。” 这里似乎有许多要转换的整数。

“下一个T号是基数-2。”

所以有些T号应该用-2来解释。

“每个人都有1到15位数。”

“注意:数字可以在左边填充0。”

“输出

输出数字的带符号基数10表示,用空格分隔。“

所以你有一个有价值的T.比如说它是34岁。 Ater你在基数-2中有34个数字。 每个都有1到15位数字。这些可以用0填充在左边。

所以你必须选择每个数字的表示(它是一个字符串吗?)。

您必须将基数-2中表示的34个数字转换为基数10,并用空格分隔34个数字。