这周文坚老师给我们传授了一些课程学习目标,如下:
1.知道怎么用一个东西。
2.知道这个东西的原理是什么。
3.基于这个原理,在自己的环境下应该怎么做选择。
4.选择过后,知道怎样成本最低。
这节课主要学习了测试。
以assert和should.js为例,比较了TDD 和 BDD 两种模式的区别。assert更适合开发者,而TDD模式则更通俗。
有一道大数相加的题目,很有意思,在此分享~
javascript能表示的最大数值是Number.MAX_VALUE,即1.7976931348623157e+308,这个数值虽然能够正确表示出来,但是存在一个精度丢失的问题。
最常见的一种大数相加解决方案,就是将数字拆成一个个字符串,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,第三步就相当于输入前两步骤的结果来递归调用自己。