/************************************************************************* > File Name: bitCal.c > Author: TL Song > Mail: songtianlun@frytea.com > Created Time: Fri 28 Aug 2020 12:58:40 AM UTC ************************************************************************/ #include #include /* *功能: 两个数相加 *@num1, @num2 加法的两个操作数 *返回值 : 两个num的相加后的值 */ int Add(int num1, int num2) { int exclusive_val = num1; //异或值 int carry_val = num2; //进位值 exclusive_val = num1 ^ num2; //取第一次异或值(没有进位的异或就是相加) carry_val = (num1 & num2) << 1; //取第一次进位值 //进位值为0是循环终止条件 while (carry_val) { int temp = exclusive_val; exclusive_val = exclusive_val ^ carry_val; //异或值与进位值进行异或 carry_val = (temp & carry_val) << 1; } return exclusive_val; } /* *功能: 减法 *算法: A - B = A + B(补码) = A + (B反码 + 1) = A + (~B + 1) *@num1, @num2; 减法的两个操作数 *返回值: 两个数的相减值 */ int Sub(int num1, int num2) { int temp = Add(~num2, 1); //取反与求补差1 return Add(num1, temp); } /* *功能: 除法 *算法: A 除 B 的意义就是看A里有多少个B,可以通过A - B实现。 * A一直循环减B,直到结果小于0。循环的次数就是结果。 *@num1, @num2; 除法的两个操作数 *返回值: 两个数的相除值 */ int div(int num1, int num2) { int count = 0; while (1) { if ((num1 = Sub(num1, num2)) < 0) { break; } count++; } return count; } /* *功能: 乘法 *算法: A 乘 B 的意义就是A个B累加,定义一个累加器count = 1; * 可以通过循环A次累加B相加实现。 *@num1, @num2; 乘法的两个操作数 *返回值: 两个数的相乘值 */ int mult(int num1, int num2) { int count = 0; int result = 0; int temp = num2; while (1) { if (num1 == count) { break; } result = Add(result, temp); count++; } return result; } int main(void) { int num1, num2; while (1) { printf("请输入两个整数: \n"); scanf("%d%d", &num1, &num2); printf("%d + %d = %d\n", num1, num2, Add(num1, num2)); printf("%d - %d = %d\n", num1, num2, Sub(num1, num2)); printf("%d * %d = %d\n", num1, num2, mult(num1, num2)); printf("%d / %d = %d\n", num1, num2, div(num1, num2)); } return 0; }