在看滴水逆向时,听到了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就是结果

1万+

被折叠的 条评论
为什么被折叠?



