美文网首页
第二周打卡

第二周打卡

作者: seeddyan | 来源:发表于2018-06-23 20:34 被阅读0次

    这周文坚老师给我们传授了一些课程学习目标,如下:
    1.知道怎么用一个东西。
    2.知道这个东西的原理是什么。
    3.基于这个原理,在自己的环境下应该怎么做选择。
    4.选择过后,知道怎样成本最低。

    这节课主要学习了测试。
    以assert和should.js为例,比较了TDD 和 BDD 两种模式的区别。assert更适合开发者,而TDD模式则更通俗。

    有一道大数相加的题目,很有意思,在此分享~
    javascript能表示的最大数值是Number.MAX_VALUE,即1.7976931348623157e+308,这个数值虽然能够正确表示出来,但是存在一个精度丢失的问题。


    JavaScript Number

    最常见的一种大数相加解决方案,就是将数字拆成一个个字符串,reverse后想加,flag保存进位值,最后reverse回来。要注意最后一位进位。
    第二种方法巧妙得运用了位运算。代码如下:

    function AddWithoutArithmetic(num1, num2) {
        if (num2 == 0) {
            return num1;
        }
        var sum = num1 ^ num2;
        var carry = (num1 & num2) << 1;
        return AddWithoutArithmetic(sum, carry);
    }
    

    原理:第一步不考虑进位,对每一位相加。0加0与1加1的结果都0,0加1与1加0的结果都是1。我们可以注意到,这和异或的结果是一样的。对异或而言,0和0、1和1异或的结果是0,而0和1、1和0的异或结果是1。接着考虑第二步进位,对0加0、0加1、1加0而言,都不会产生进位,只有1加1时,会向前产生一个进位。此时我们可以想象成是两个数先做位与运算,然后再向左移动一位。只有两个数都是1的时候,位与得到的结果是1,其余都是0。第三步把前两个步骤的结果相加。如果我们定义一个函数AddWithoutArithmetic,第三步就相当于输入前两步骤的结果来递归调用自己。

    Reference

    travis-ci官网
    js实现大数相加
    面试题:位操作实现四则运算

    相关文章

      网友评论

          本文标题:第二周打卡

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