前端基础笔记——求整数之和(多种方法)

写一个函数,求两个整数之和,要求在函数体内不得使用+-*/四则运算符号。
function Add(num1, num2)
{
    // 第一种方式,也使用了加号,但是在eval函数内
    // return eval(`num1+num2`)
    // 第二种方式,通过把数字转换为二进制,然后切割成数组,把数组遍历进行计算
    // 但是第二种方式遇到负数就抓瞎了。。
    var str1=num1.toString(2).split('');
    var str2=num2.toString(2).split('');
    var max;
    var strflag;
    // 补零
    if(str1.length>str2.length){
        var len=str1.length;
        var tem=str1.length-str2.length;
        for(var j=0;j<tem;j++){
            str2.unshift("0")
        }
    }else{
        var len=str2.length;
        var tem=str2.length-str1.length
        for(var j=0;j<tem;j++){
            str1.unshift("0")
        }
    }
    var mystr=[];
    var flag=false;
    // console.log(str1,str2)
    for(var i=len-1;i>=0;i--){
        // 为1进一位
        if(flag){
            if(str1[i]==1&&str2[i]==1){
                mystr.unshift(1)
                flag=true;
            }else if(str1[i]==1||str2[i]==1){
                mystr.unshift(0)
                flag=true;
            }else{
                mystr.unshift(1)
                flag=false;
            }
        }else{
            if(str1[i]==1&&str2[i]==1){
                mystr.unshift(0)
                flag=true;
            }else if(str1[i]==1||str2[i]==1){
                mystr.unshift(1)
                flag=false;
            }else{
                mystr.unshift(0)
                flag=false;
            }
        }
        // 判断最后一位
        if(flag&&i==0){
            mystr.unshift(1)
        }
    }
    // console.log(mystr)
    return parseInt(mystr.join(''),2)
}

// 第三种方式:使用异或,与进行判断每一位的数字
// 前提知识:
// 负数在计算机中以原码的补码形式存在
// 如-1表示为 1111110; -5(原码是 0000101)表示为11111010
console.log(-1&2);//2,必须两个都为1
console.log(-1^2);// -3
console.log((-1&2)<<1);//2左移一位为4

			function Add(num1,num2){
				while (num2!=0) {
					// -1^2 => -3; -7;-15,-31
					// 按位异或用于保留不需要进位的后面的数
					var temp = num1^num2;
					// -1&2 => 2, 2<<1 =>4 ;8;16;32
					// 按位与+左移一位就是为了在有两个1的时候可以进一位,也就是进位之后的2进制幂数
					num2 = (num1&num2)<<1;
					num1 = temp;
				}
				return num1;
			}
			console.log(Add(-1,2))
			// (5,4),第一次异或就是确定后三位是001,然后第一次与就是确定进一位,1000
			// 然后1000和1继续第二次异或,变成1001,然后第二次与就是0,0就可以退出了

// 第四种方式:通过++,--
function Add(num1, num2)
{
    // 第四种方式:判断数的正负,如果是正则++,如果是负则--,缺点在于时间复杂度太大了!
    if(Math.abs(num1)<Math.abs(num2)){
        var tem=num2;
        num2=num1;
        num1=tem;
    }
    // 对绝对值小的数进行循环 
    while(num2!=0){
        if(num2>0){
            num2--;
            num1++
        }else{
            // 如果num2是负数
            num2++;
            num1--;
        }
    }
    return num1
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值