设计思路

先将输入的两个二进制数转换成十进制,然后再进行相应的运算,最后将结果转换成二进制的形式打印。

运行逻辑示意图

函数调用示意图

源码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define BINARY_SIZE 32

typedef enum{ false = 0, true } Bool;

/* function interface */
/* tool */
int _my_pow(int x, int y);
/* bottom */
void binary_print(int data);
int _2to10(char* data);
/* arthmetic */
void my_add();
void my_sub();
void my_mul();
void my_div();
/* main logic */
void MainLoop();

/* test case */
int main(){
	MainLoop();
	return 0;
}

/* function realize */
void MainLoop(){
	printf("--- 二进制整数运算器 ---\n");
	printf("-----------------------\n");
	Bool IsWork = true; //初始化运算器工作状态
	char option;
	while (IsWork){
		printf("选择要进行的运算/操作:\n  [1.加法 | 2.减法 | 3.乘法 \
				| 4.除法 | 5.清屏 | 6.退出]\n");
		printf(">>>");
		option = getchar();
		fflush(stdin); //清空输入缓冲区
		switch (option){
		case '1': my_add();
			break;
		case '2': my_sub();
			break;
		case '3': my_mul();
			break;
		case '4': my_div();
			break;
		//如果在Linux平台下编译,将system内改为“clear"
		case '5': system("cls"); 
			break;
		case '6':
			IsWork = false;
			break;
		default:
			printf("请在本软件支持范围内选择!\n\n");
			system("pause"); //如果在Linux平台下编译,去掉这行代码
		}
	}
}

void my_add(){
	char binary_num1[BINARY_SIZE] = { 0 };
	char binary_num2[BINARY_SIZE] = { 0 };
	printf("输入第一个加数:");
	scanf("%[^\n]%*c", binary_num1);
	int num1 = _2to10(binary_num1);
	printf("输入第二个加数:");
	scanf("%[^\n]%*c", binary_num2);
	int num2 = _2to10(binary_num2);

	int result = num1 + num2;

	printf("运算结果为:");
	binary_print(result);
	printf("\n\n");
}

void my_sub(){
	char binary_num1[BINARY_SIZE] = { 0 };
	char binary_num2[BINARY_SIZE] = { 0 };
	printf("输入被减数:");
	scanf("%[^\n]%*c", binary_num1);
	int num1 = _2to10(binary_num1);
	printf("输入减数:");
	scanf("%[^\n]%*c", binary_num2);
	int num2 = _2to10(binary_num2);

	int result = num1 - num2;
	printf("运算结果为:");
	binary_print(result);
	printf("\n\n");
}

void my_mul(){
	char binary_num1[BINARY_SIZE] = { 0 };
	char binary_num2[BINARY_SIZE] = { 0 };
	printf("输入第一个因数:");
	scanf("%[^\n]%*c", binary_num1);
	int num1 = _2to10(binary_num1);
	printf("输入第二个因数:");
	scanf("%[^\n]%*c", binary_num2);
	int num2 = _2to10(binary_num2);

	int result = num1 * num2;

	printf("运算结果为:");
	binary_print(result);
	printf("\n\n");
}

void my_div(){
	char binary_num1[BINARY_SIZE] = { 0 };
	char binary_num2[BINARY_SIZE] = { 0 };
	printf("输入被除数:");
	scanf("%[^\n]%*c", binary_num1);
	int num1 = _2to10(binary_num1);
	printf("输入除数:");
	scanf("%[^\n]%*c", binary_num2);
	int num2 = _2to10(binary_num2);
	if (!num2){ //如果除数为0,则退出运算
		printf("除数有误!!!\n");
		system("pause"); //如果在Linux平台下编译,去掉这行代码
		exit(EXIT_FAILURE);
	}

	int result = num1 / num2;
	printf("运算结果为:");
	binary_print(result);
	printf("\n\n");
}

int _my_pow(int x, int y){
	int result = 1;
	while (y){
		if (y & 1){
			result *= x;
		}
		y >>= 1;
		x *= x;
	}
	return result;
}

int _2to10(char* data){
	int size = (int)strlen(data) - 1;
	int conversion_result = 0;
	for (int i = size; i >= 0; --i){
		int tmp = data[i] - 48;//将字符‘1’/‘0’转换成数字1/0
		//_my_pow函数也可以用库函数pow替代,不过需要引入头文件<math.h>
		conversion_result += tmp * _my_pow(2, size - i);
	}
	return conversion_result;
}

void binary_print(int data){
	char tmp[BINARY_SIZE] = { 0 };
	if (data > 0){
		for (int i = 0; data; ++i){
			if (data % 2 == 0)
				tmp[i] = '0';
			else
				tmp[i] = '1';
			data >>= 1;
		}
		for (int i = strlen(tmp) - 1, j = 0; i >= 0; --i)
			printf("%c", tmp[i]);
		return;
	}
	else if (data < 0){
		//这里用int用32位表示
		data = -data; //将data变成正数
		data = ~data + 1; //将data变成data的补码
		//用位运算获取data的每一位,赋给数组
		for (int i = 31, j = 0; i >= 0; --i, ++j){
			tmp[j] = ((data >> i) & 1) ? '1' : '0';
		}
		//正序打印数组即可
		for (int i = 0; i < 32; ++i)
			printf("%c", tmp[i]);
		return;
	}
	printf("0");
}

更多推荐

C语言实现二进制运算器