CPU处理加法的简单理解

在看滴水逆向时,听到了CPU处理加法的过程 

大致为//为了简单使用四位,便于理解

__int4 add(__int4 X,__int4 Y)

{

    while(1)
    {

        R = X xor Y;

        T = X and Y;

         T = T <<1;

         if( 0 == T)

              break;

         X = T;

         Y = R;
     }

    return R;

}

理一理思路,为啥这样操作能实现加法呢

思路:

       首先把X按位分解 X = !000+0@00 + 00#0 + 000$

       然后把Y按位分解 Y = %000+0^00 + 00&0 +000*

       按位分解后,只存在3种情况 ①两个0 ②一个0一个1 ③两个1

        分类讨论:两个0 相加还是0 

                          一个0一个1 相加还是1 相当于xor

                          两个1 相加进位 相当于and

           先找到需要进位的位置T =  X and Y ,然后把剩下的值保存一下 R = X xor Y

           即X + Y = T + T + R (T 两个数对应位置都为1 所以拆分开为2个T)

           然后T+T  = T << 1 

           X + Y = T<< 1 + R

           然后 进位后的数据 有可能又和 R的数据相加时又产生进位

           所以不断循环 直到XandY  不产生进位 或者 产生的进位 对R无影响

           即 X and Y = 0000 (不产生进位)或者 X and Y = 1000 (产生的进位超出4位被丢弃,对R无影响)

举例:

X+Y = (!000 + %000) + (0@00 + 0^00) + (00#0+00&0) + (000$+ 000*)

然后拿两个值试试

X=1001 Y=1011

X+Y = 1001(T) + 1001(T) + 0010(R)

        = 10010(T <<1) + 0010(R)

X = 0010  Y = 0010

        =  0010(T) + 0010(T) + 0000(R)

        =  0000(T) + 0100(R) 

返回 0100就是结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值