题目:
读入一个由16位连续二进制数字组成的二进制串,计算其所表示的有符号整数值。
输入格式:
输入在一行中给出的连续16位二进制数字串。
输出格式:
在一行中输出其所表示的有符号整数值。
输入样例1:
0011000000111001
输出样例1:
在这里给出相应的输出。例如:
12345
输入样例2:
1100111111000111
输出样例2:
在这里给出相应的输出。例如:
-12345
代码实现:
#include <stdio.h>
#include <math.h>
int main()
{
int x, i, o, s = 0;
scanf("%1d", &o);
if(o == 0){
for(i = 14; i>=0; i--){
scanf("%1d", &x);
s = s+pow(2, i)*x;
}
printf("%d", s);
}else{
int a[16];
a[1] = o;
for(i = 2; i<=16; i++){
scanf("%1d", &a[i]);
}
if((a[2]== 0)&&(a[3] == 0)&&(a[4] == 0)&&(a[5] == 0)&&(a[6] == 0)&&(a[7] == 0)&&(a[8] == 0)&&(a[9] == 0)&&(a[10] == 0)&&(a[11] == 0)&&(a[12] == 0)&&(a[13] == 0)&&(a[14] == 0)&&(a[15] == 0)&&(a[16] == 0)){
printf("-32768");
return 0;
}
for(i = 16; i>=1; i--){
if(a[i] == 1){
a[i] = 0;
break;
}else{
a[i] = 1;
}
}
for(i = 1; i<=16; i++){
if(a[i] == 0){
a[i] = 1;
}else{
a[i] = 0;
}
}
for(i = 2; i<=16; i++){
s = s+pow(2, 16-i)*a[i];
}
printf("-%d", s);
}
return 0;
}
解析:
分正负两种情况。若为正数,则原码反码补码相同,不需要转换,直接累加即可;若为负数,先将补码减一得到反码,再将反码按位取反,最后再将原码累加。注意-32768为一种特殊情况,单独考虑。