一个大数相加的思路,膜拜大神
function sumStrings(a,b){
var res='', c=0;
a = a.split('');
b = b.split('');
while (a.length || b.length || c){
c += ~~a.pop() + ~~b.pop();
res = c % 10 + res;
c = c>9;
}
return res.replace(/^0+/,'');
}
说下自己的理解
1. 先把两个参数转换成数组以便循环,每次从数组中取出一个元素,用~~运算符进行数字类型转换
2. 变量res里保存的是最后相加的结果,是string类型,每次进行字符串连接。当两个数字相加超过10的时候进行取余,将取余结果进行连接
3. 最巧妙的地方是根据c>9来进行加法的进位,根据bool和number类型的转换。
下面列出了该算法里用到的一些基础知识
1. ~ 位非运算符, 对位求反,转换逻辑如下,实际使用中多用于判断某个字符串是否包含另外一个字符串
var testResult=(typeof testData==="number"&&!isNaN(testData)&&testData!==Infinity)?(testData>0)?-Math.floor(testData)-1:-Math.ceil(testData)-1:-1;
var a="a"; var b="bcca"; console.log(b.indexOf(a)); console.log(~b.indexOf(a));
// 3,-4
~~字符运算规则 转换成数字类型
var testResult=(typeof testData==="number"&&!isNaN(testData)&&testData!==Infinity)?(testData>0)?Math.floor(testData):Math.ceil(testData):0;
2. | 取整运算符
console.log(1.3|0); //1
3. >> 取半运算符
50 >> 1 //25
50 >> 0 //50
50 >> 2 //12
4.&运算符判断一个数是奇数还是偶数
偶数 & 1 = 0
奇数 & 1 = 1
5. 使用^来完成值交换或者比较两个数是否相等,神奇的异或。。。。
a = 1
b = 2
a ^= b
b ^= a
a ^= b
结果a=2,b=1
顺便列举下几种交换值的方法
1. 借助第三变量,性能通常比另外几种好些
2. 引入对象,利用对象的属性进行交换
3. 利用数组下标
4. 数字的加减法
5. ES6语法,需要支持ES6