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;
|
|||
|
}
|