不用加减乘除运算符 求整数的7倍
可以使用三类方式:位运算加法、JS hack、进制转换。实现方式分别如下:
这道题的关键在于不能使用运算符号,那么一个直接的思路就是能不能不用加减乘除实现整数的加减法呢?其实不难,复习一下大学课本里面计算机组成原理,应该能想起来如何实现基本的加减乘除法。这里,我们其实只需要实现一个基本的加法:
a | b | a+b | 进位 |
---|---|---|---|
0 | 0 | 0 | 无 |
1 | 0 | 1 | 无 |
0 | 1 | 1 | 无 |
1 | 1 | 0 | 有 |
从上面的表可以看出一种实现简单的多位二进制整数加法的算法如下
m 和 n 是两个二进制整数,求 m+n:
- 用与运算求 m 和 n 共同为 1 的位:m' = m & n
- 用异或运算求 m 和 n 其中一个为 1 的位: n' = m ^ n
- 如果 m' 不为 0,那么将 m' 左移一位(进位),即 m = m' << 1,即 n = n',跳回到步骤 1
- 如果 m' 为 0,那么 n' 就是我们要求的结果
/* -- 位运算 -- */ // 先定义位运算加法 function bitAdd(m, n){ while(m){ [m, n] = [(m & n) << 1, m ^ n]; } return n; } // 位运算实现方式 1 - 循环累加 7 次 let multiply7_bo_1 = (num)=> { let sum = 0,counter = new Array(7); // 得到 [empty × 7] while(counter.length){ sum = bitAdd(sum, num); counter.shift(); } return sum; } // 位运算实现方式 2 - 二进制进 3 位(乘以 8)后,加自己的补码(乘以-1) let multiply7_bo_2 = (num) => bitAdd(num << 3, -num) ; /* -- JS hack -- */ // hack 方式 1 - 利用 Function 的构造器 & 乘号的字节码 let multiply7_hack_1 = (num) => new Function(["return ",num,String.fromCharCode(42),"7"].join(""))(); // hack 方式 2 - 利用 eval 执行器 & 乘号的字节码 let multiply7_hack_2 = (num) => eval([num,String.fromCharCode(42),"7"].join("")); // hack 方式 3 - 利用 SetTimeout 的参数 & 乘号的字节码 setTimeout(["window.multiply7_hack_3=(num)=>(7",String.fromCharCode(42),"num)"].join("")) /* -- 进制转换 -- */ // 进制转换方式 - 利用 toString 转为七进制整数;然后末尾补 0(左移一位)后通过 parseInt 转回十进制 let multiply7_base7 = (num)=>parseInt([num.toString(7),'0'].join(''),7);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: 输出以下打印结果
下一篇: 谈谈自己对于 AOP 的了解
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论