106 lines
2.4 KiB
C
106 lines
2.4 KiB
C
/*************************************************************************
|
||
> File Name: bitCal.c
|
||
> Author: TL Song
|
||
> Mail: songtianlun@frytea.com
|
||
> Created Time: Fri 28 Aug 2020 12:58:40 AM UTC
|
||
************************************************************************/
|
||
|
||
#include<stdio.h>
|
||
|
||
#include <stdio.h>
|
||
|
||
/*
|
||
*功能: 两个数相加
|
||
*@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;
|
||
}
|