PracticeDev/study_clang/BitArithmetic/bitCal.c

106 lines
2.4 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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