210 lines
5.8 KiB
C++
210 lines
5.8 KiB
C++
/*************************************************************************
|
||
> File Name: main.c
|
||
> Author: TL Song
|
||
> Mail: songtianlun@frytea.com
|
||
> Created Time: Thu 27 Aug 2020 12:08:59 PM UTC
|
||
************************************************************************/
|
||
|
||
#include<stdio.h>
|
||
#include<time.h>
|
||
#include<map>
|
||
#include<iostream>
|
||
|
||
using namespace std;
|
||
|
||
int bitAdd(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;
|
||
|
||
}
|
||
|
||
int add(int a, int b)
|
||
{
|
||
return a+b;
|
||
}
|
||
|
||
int bitSubtraction(int num1, int num2)
|
||
{
|
||
int temp = bitAdd(~num2, 1); //取反与求补差1
|
||
return bitAdd(num1, temp);
|
||
}
|
||
|
||
int subtraction(int a, int b)
|
||
{
|
||
return a - b;
|
||
}
|
||
|
||
int bitDivide(int x, int y) {
|
||
int ans=0;
|
||
for(int i=31;i>=0;i--)
|
||
{
|
||
// //比较x是否大于y的(1<<i)次方,避免将x与(y<<i)比较,因为不确定y的(1<<i)次方是否溢出
|
||
if( (x>>i) >=y )
|
||
{
|
||
ans+=(1<<i);
|
||
x-= (y<<i);
|
||
}
|
||
}
|
||
return ans;
|
||
}
|
||
|
||
int divide(int a, int b)
|
||
{
|
||
return a/b;
|
||
}
|
||
|
||
int multiply(int a, int b)
|
||
{
|
||
return a * b;
|
||
}
|
||
|
||
int bitMultiply(int a, int b)
|
||
{
|
||
int ans = 0;
|
||
while(b)
|
||
{
|
||
if(b&1) //b最后一位是否为1
|
||
ans = bitAdd(ans, a);
|
||
a = (a<<1);
|
||
b = (b>>1);
|
||
}
|
||
return ans;
|
||
}
|
||
|
||
int mulTwo(int n)
|
||
{
|
||
return n << 1;
|
||
}
|
||
|
||
int divTwo(int n)
|
||
{
|
||
return n >> 1;
|
||
}
|
||
|
||
int getAverage(int x, int y)
|
||
{
|
||
return ( x + y ) >> 1;
|
||
}
|
||
|
||
int main()
|
||
{
|
||
int i;
|
||
int a,b;
|
||
int result;
|
||
int num = 10000000;
|
||
clock_t start, finish;
|
||
double duration;
|
||
|
||
//printf("Test Add:\n");
|
||
printf("Please Enter the num1: ");
|
||
scanf("%d",&a);
|
||
printf("Please Enter the num2: ");
|
||
scanf("%d",&b);
|
||
|
||
printf("---------------------------------------------------------------------------------------------\n");
|
||
start = clock();
|
||
for(i=0;i<num;i++)
|
||
result = bitAdd(a,b);
|
||
// printf("Bit add calculation result: %d, ", bitAdd(a,b));
|
||
finish = clock();
|
||
duration = (double)(finish - start) / CLOCKS_PER_SEC;
|
||
printf("> Bit add calculation %d times total time: %f, Last result: %d\n", num,duration,result);
|
||
|
||
start = clock();
|
||
for(i=0;i<num;i++)
|
||
result = add(a,b);
|
||
// printf("Direct add calculation result: %d, ", (a+b));
|
||
finish = clock();
|
||
duration = (double)(finish - start) / CLOCKS_PER_SEC;
|
||
printf("> Direct add calculation %d times total time: %f, Last result: %d\n", num,duration,result);
|
||
printf("---------------------------------------------------------------------------------------------\n");
|
||
start = clock();
|
||
for(i=0;i<num;i++)
|
||
result =bitMultiply(a,b);
|
||
finish = clock();
|
||
duration = (double)(finish - start) / CLOCKS_PER_SEC;
|
||
printf("> Bit multiply calculation %d times total time: %f, Last result: %d\n", num,duration,result);
|
||
|
||
start = clock();
|
||
for(i=0;i<num;i++)
|
||
result = multiply(a,b);
|
||
finish = clock();
|
||
duration = (double)(finish - start) / CLOCKS_PER_SEC;
|
||
printf("> Direct multiply calculation %d times total time: %f, Last result: %d\n", num,duration,result);
|
||
printf("---------------------------------------------------------------------------------------------\n");
|
||
start = clock();
|
||
for(i=0;i<num;i++)
|
||
result =bitDivide(a,b);
|
||
finish = clock();
|
||
duration = (double)(finish - start) / CLOCKS_PER_SEC;
|
||
printf("> Bit divide calculation %d times total time: %f, Last result: %d\n", num,duration,result);
|
||
start = clock();
|
||
for(i=0;i<num;i++)
|
||
result = divide(a,b);
|
||
finish = clock();
|
||
duration = (double)(finish - start) / CLOCKS_PER_SEC;
|
||
printf("> Direct divide calculation %d times total time: %f, Last result: %d\n", num,duration,result);
|
||
printf("---------------------------------------------------------------------------------------------\n");
|
||
start = clock();
|
||
for(i=0;i<num;i++)
|
||
result = mulTwo(a);
|
||
finish = clock();
|
||
duration = (double)(finish - start) / CLOCKS_PER_SEC;
|
||
printf("> Bit multiply 2 calculation %d times total time: %f, Last result: %d\n", num,duration,result);
|
||
|
||
start = clock();
|
||
for(i=0;i<num;i++)
|
||
result = multiply(a,2);
|
||
finish = clock();
|
||
duration = (double)(finish - start) / CLOCKS_PER_SEC;
|
||
printf("> Direct multiply 2 calculation %d times total time: %f, Last result: %d\n", num,duration,result);
|
||
printf("---------------------------------------------------------------------------------------------\n");
|
||
|
||
start = clock();
|
||
for(i=0;i<num;i++)
|
||
result = divTwo(a);
|
||
finish = clock();
|
||
duration = (double)(finish - start) / CLOCKS_PER_SEC;
|
||
printf("> Bit divide 2 calculation %d times total time: %f, Last result: %d\n", num,duration,result);
|
||
|
||
start = clock();
|
||
for(i=0;i<num;i++)
|
||
result = divide(a,2);
|
||
finish = clock();
|
||
duration = (double)(finish - start) / CLOCKS_PER_SEC;
|
||
printf("> Direct divide 2 calculation %d times total time: %f, Last result: %d\n", num,duration,result);
|
||
|
||
|
||
printf("---------------------------------------------------------------------------------------------\n");
|
||
start = clock();
|
||
for(i=0;i<num;i++)
|
||
result = getAverage(a,b);
|
||
finish = clock();
|
||
duration = (double)(finish - start) / CLOCKS_PER_SEC;
|
||
printf("> Bit average calculation %d times total time: %f, Last result: %d\n", num,duration,result);
|
||
|
||
start = clock();
|
||
for(i=0;i<num;i++)
|
||
result = divide(a+b,2);
|
||
finish = clock();
|
||
duration = (double)(finish - start) / CLOCKS_PER_SEC;
|
||
printf("> Direct average calculation %d times total time: %f, Last result: %d\n", num,duration,result);
|
||
printf("---------------------------------------------------------------------------------------------\n");
|
||
}
|
||
|
||
|