【C语言练习题】计算16位二进制数所表示的有符号整数

题目:

读入一个由16位连续二进制数字组成的二进制串,计算其所表示的有符号整数值。

输入格式:

输入在一行中给出的连续16位二进制数字串。

输出格式:

在一行中输出其所表示的有符号整数值。

输入样例1:

0011000000111001

输出样例1:

在这里给出相应的输出。例如:

12345

输入样例2:

1100111111000111

输出样例2:

在这里给出相应的输出。例如:

-12345

代码实现:

#include 
#include 
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为一种特殊情况,单独考虑。

你可能感兴趣的:(c语言,开发语言,算法,c++,c#)