每日一篇系列--在不使用加减乘除的情况下,计算某整数的某倍数

最近star了一个Git项目,项目主要是收集各厂的面试题,有很多有意思的题目,每天看一题,记个笔记。
传送门:https://github.com/Advanced-Frontend/Daily-Interview-Question

这道面试题的几个解法如下:
1.最简单的方法:先转换成对应倍数的进制,后面补0后再转回10进制

let getRes = (num, multiple) => {
    let res = [num.toString(multiple), '0'].join('')
    return parseInt(res, 7)
}

getRes(12, 7) // 84

2.位运算(相关细节参考:https://blog.csdn.net/sinat_35121480/article/details/53510793)
核心思想:
1、m 和 n 是两个二进制整数,求 m + n:
2、用与运算求 m 和 n 共同为 “1” 的位: m’ = m & n
3、用异或运算求 m 和 n 其中一个为 “1” 的位: n’ = m ^ n
4、如果 m’ 不为 0,那么将 m’ 左移一位(进位),记 m = m’ << 1,记 n = n’,跳回到步骤 1
5、如果 m’ 为 0,那么 n’ 就是我们要求的结果

<<: 左移运算
将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
例:a = a<< 2将a的二进制位左移2位,右补0,
左移1位后a = a *2;
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。

^: 异或运算
参加运算的两个数据,按二进制位进行“异或”运算。
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。

&: 按位与运算
参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0

/* 获取和 */
let add = (sum, num) => {
    while(sum) {
        [sum, num] = [(sum & num) << 1, sum ^ num]
    }
    return num
}

/* 求和 */
let getRes = (num, mul) => {
    let sum = 0
    let arr = new Array(mul)
    while(arr.length) {
        sum = add(sum, num)
        arr.shift()
    }
    return sum
}

3.黑科技
(1).String.fromCharCode方法,将对应的uniCode转换成对应的字符串
eval方法,计算某个字符串,执行字符串中的js代码
*号对应的uniCode为42

let getRes = (num, mul) => eval([num, String.fromCharCode(42), mul].join(''))

(2).new Function:实例化一个Function对象来执行参数中的JS

let getRes = (num, mul) => {
    let _fn = new Function("return " + num + String.fromCharCode(42) + mul)
    return _fn()
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值