美文网首页
位运算实现四则运算

位运算实现四则运算

作者: kevinfuture | 来源:发表于2019-03-12 09:59 被阅读0次
    有时候,我们为了追求效率,或者某些场景下,可能针对运算方式进行调整

比如说,不同语言进行数据传输的时候,数据类型精度不匹配,如何尽量减少这种情况的发生
就需要使用到一些位运算的技巧了。
抛开语言层面,仅从逻辑出发即可,以下代码,都可以使用其他语言方式替换

/**
 * 两数加法运算
 * **/
const add = function (num1, num2) {
    //进位运算为0则结束
    if (num2 === 0) {
        return num1;
    }
    //没有进位的运算 亦或操作,(两不相等则1)
    let sum = num1 ^ num2;
    //与操作,同1 则1,这时候使用左移一位的操作表示进位
    let carry = (num1 & num2) << 1;
    return this.add(sum, carry);
}
/**
 * 两数减法运算
 * 减法,简单的做法就是把减法看做是加法,(加一个负数)
 * **/
const plus = function (num1, num2) {
    //取反相加
    let num3 = this.add(~num2, 1);
    let result = this.add(num1, num3);
    return result;
}
/**
 * 两数乘法运算m * n
 * 实际上就是将m进行n次相加运算,但是要考虑到负数的情况等
 * 所以需要对负数进行取反处理
 * **/
const multi = function (num1, num2) {
    let a = num1 < 0 ? this.add(~num1, 1) : num1;
    let b = num2 < 0 ? this.add(~num2, 1) : num2;
    let result = 0;
    while (b > 0) {
        //取尾数,因为要累加
        if ((b & 0x1) > 0) {
            result = this.add(result, a);
        }
        //每次运算结束,被乘数进行一次左移运算,进位的操作
        a = a << 1;
        //乘数进行一次右移操作,表示要执行次数
        b = b >> 1;
    }
    //亦或操作,两不相等则1,判断正负号,取最高位比较,如果为负数,则取反加一
    if ((num1 ^ num2) < 0) {
        result = this.add(~result, 1);
    }
    return result;
}
/**
 * 两数除法运算
 * 后续实现,目前仅用的到加法与乘法
 * **/
const division = function (num1, num2) {
      //可以想一想如何使用位运算实现除法的方式
}

相关文章

网友评论

      本文标题:位运算实现四则运算

      本文链接:https://www.haomeiwen.com/subject/hlfgpqtx.html