设为首页 加入收藏

TOP

通过位操作实现四则运算(一)
2018-10-21 18:08:21 】 浏览:119
Tags:通过 操作 实现 四则 运算

在最早学习四则运算的过程中,我们其实就已经掌握了进制算法,这一次我将对二进制运用这个进制算法来实现四则运算。

四则运算

math.c

/**
 * 功能:通过位操作实现四则运算
 * 算法:完全参照十进制的进制算法
 *
 * Created with CLion
 * User: zzzz76
 * Date: 2018-02-10
 */

#include <stdio.h>
#include <assert.h>
#include "math.h"

/**
 * 加法:往上递归实现
 *
 * @param a
 * @param b
 * @return
 */
int base_add(int a, int b) {
    /* 值在函数中的传递只能通过参数或者返回操作,所以递归效果无非是体现在参数和返回操作上 */
    if (b == 0) {
        return a;
    }
    int save = a ^b;
    int promote = (a & b) << 1;
    return base_add(save, promote);
}

/**
 * 加法:迭代实现
 *
 * @param a
 * @param b
 * @return
 */
int base_add_re(int a, int b) {
    while (a && b) {
        int promote = (a & b) << 1;
        a = a ^ b;
        b = promote;
    }
    return a ^ b;
}

/**
 * 减法:往上递归实现
 *
 * @param a
 * @param b
 * @return
 */
int base_sub(int a, int b) {
    if (b == 0) {
        return a;
    }
    int save = a ^ b;
    int reduce = ((~a) & b) << 1;
    return base_sub(save, reduce);
}

/**
 * 减法:迭代实现
 *
 * @param a
 * @param b
 * @return
 */
int base_sub_re(int a, int b) {
    while(b) {
        int save = a ^ b;
        b = ((~a) & b) << 1;
        a = save;
    }
    return a;
}

/**
 * 减法:补位实现
 *
 * @param a
 * @param b
 * @return
 */
int base_sub_re_re(int a, int b) {
    return base_add(a, base_add(~b, 1));
}

/**
 * 乘法:递归实现
 *
 * @param a
 * @param b
 * @return
 */
int base_mul(int a, int b) {
    int count = 0;
    if (a == 0) {
        return count;
    }
    if (a & 1) {
        count = base_add(count, b);
    }
    a = (unsigned)a >> 1;
    b <<= 1;
    count = base_add(count, base_mul(a, b));
    return count;
}

/**
 * 乘法:迭代实现
 *
 * @param a
 * @param b
 * @return
 */
int base_mul_re(int a, int b) {
    int count = 0;
    while (a) {
        if (a & 1) {
            count = base_add(count, b);
        }
        a = (unsigned)a >> 1;
        b <<= 1;
    }
    return count;
}

/**
 * 除法:迭代实现
 *
 * @param a
 * @param b
 * @return
 */
int base_div(int a, int b) {
    assert(b);
    int result = 0;
    int bit_num = 31;
    while (bit_num != -1) {
        if (b <= ((unsigned) a >> bit_num)) {
            result = base_add(result, 1 << bit_num);
            a = base_sub(a, b << bit_num);
        }
        bit_num = base_sub(bit_num, 1);
    }
    return result;
}

/**
 * 除法:递归实现
 *
 * @param a
 * @param b
 * @return
 */
int base_div_re(int a, int b) {
    assert(b);
    if (a < (unsigned) b) {
        return 0;
    }
    int bit_num = 0;
    while (b <= (unsigned) a >> 1 >> bit_num) {
        bit_num = base_add(bit_num, 1);
    }
    int result = 1 << bit_num;
    a = base_sub(a, b << bit_num);
    result = base_add(result, base_div_re(a, b));
    return result;
}

math.h

/**
 * Created with CLion
 * User: zzzz76
 * Date: 2018-02-12
 */

#ifndef MATH_H
#define MATH_H

int base_add(int a, int b);
int base_add_re(int a, int b);

int base_sub(int a, int b);
int base_sub_re(int a, int b);
int base_sub_re_re(int a, int b);

int base_mul(int a, int b);
int base_mul_re(int a, int b);

int base_div(int a, int b);
int base_div_re(int a, int b);

#endif //MATH_H

test.c

/**
 * Created with CLion
 * User: zzzz76
 * Date: 2018-02-12
 */

#include "math.h"
#include <stdio.h>

static int main_ret = 0;
static int test_count = 0;
static int test_pass = 0;

#define EXPECT_EQ_BASE(expect, actual, format) \
    do {\
        test_count++;\
        if ((expect) == (actual)) {\
            test_pass++;\
        } else {\
            fprintf(stderr, "%s:%d: expect: " format " actual: " format "\n", __FILE__, __LINE__, expect, actual);\
            main_ret = 1;\
        }\
    } while(0);

#define EXPECT_EQ_INT(expect, actual) EXPECT_EQ_BASE(expect, actual, "%d");

#define TEST_BASE_ADD(expect, a, b) \
    EXPECT_EQ_INT(e
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇c++(002)学习输入cin 下一篇函数指针

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目