C++ 从两个补码转换为十进制

C++ 从两个补码转换为十进制,c++,bit-manipulation,bit,base,C++,Bit Manipulation,Bit,Base,您可能熟悉有符号整数的两个补码表示。它是目前使用最广泛的二进制整数表示法。不太为人所知的是关于二进制整数表示的其他一些建议,包括base-2。Base-2与twos补码具有相同的运算便利性,并且可能更易于描述。(见附件) 例如: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填充 输出 输

您可能熟悉有符号整数的两个补码表示。它是目前使用最广泛的二进制整数表示法。不太为人所知的是关于二进制整数表示的其他一些建议,包括base-2。Base-2与twos补码具有相同的运算便利性,并且可能更易于描述。(见附件)

例如: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;
}
#包括
#包括
使用名称空间std;
long-long-int转换(long-long-int-base,long-long-int-num){
长整型exp=0;
长整型输出=0;
while(num!=0){
长整数位数=num-10*int(num/10);
输出+=数字*功率(基数,exp);
exp++;
num=int(num/10);
}
返回输出;
}
int main(){
int案例;
cin>>病例;
长整型输入;
长整型基数=-2;
cin>>输入;
cout>输入;

cout数字是一个抽象概念,可以用手指来表达

算术以不同的方式指导抽象数字的表示,称为编号系统

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


您定义的convert函数将数字和基数转换为数字。因此,它不会以数字序列的形式表示该数字。

数字是一个抽象概念,可以用手指表达(例如)

算术以不同的方式指导抽象数字的表示,称为编号系统

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


您定义的convert函数将数字和基数转换为数字。因此,它不会以数字序列的形式表示该数字。

因此,正如您所说,最好阅读以下问题:

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

“下一个T数字是以-2为基数的数字。”

所以有T个数字应该用基数-2来解释

“每个都有1到15个数字。”

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

“产出

输出数字的带符号的以10为基数的表示形式,以空格分隔。“

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

因此,您必须选择每个数字的表示形式(是否为字符串?)


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

因此,正如您所说,最好阅读以下问题:

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

“下一个T数字是以-2为基数的数字。”

所以有T个数字应该用基数-2来解释

“每个都有1到15个数字。”

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

“产出

输出数字的带符号的以10为基数的表示形式,以空格分隔。“

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

因此,您必须选择每个数字的表示形式(是否为字符串?)


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

乔治:我不明白。我应该将输入从以-2为基数转换为以10为基数。打印出以10为基数的数字有什么错可能是我不明白需要什么。你能准确地解释一下你有什么输入和你需要什么输出吗?@George:这是一个自动判断的编程练习。除了问题中的描述之外,你不知道输入是什么。你的程序运行在一台你无法控制的机器上。乔治:我不明白。我支持sed将输入从基数-2转换为基数10。打印数字(以基数10)有什么问题?可能是我不明白需要什么。你能准确地解释一下你有什么输入和你需要什么输出吗?@George:这是一个自动判断的编程练习。除了问题中的描述之外,你不知道输入是什么。你的程序在你无法控制的机器上运行。