关于逻辑右移和算术右移
vs中,对于unsigned类型,是逻辑右移,对于signed,算术右移
加法器的实现
对于不考虑进位的加法
0+0=0;1+0=1;0+1=1;1+1=0;即是异或运算
考虑进位
0+0==;1+0=0;0+1=0;1+1=1;即是与运算
以下程序,a即不考虑进位部分,b为进位部分。
int add(int a,int b)
{
int c = 0;
while(c = a&b)
{
a = a^b;
b = (c)<<1;
}
return (a^b);
}
对于减法,可转换为加法
int rev(int a)
{
return(1+ ~a);
}
int sub(int a,int b)
{
return add(a,rev(b));
}
对于乘法
a*5 = a*4+a
以下只实现了正数乘法
int mul( int a, int b ){
int c = 0x1<<(sizeof(int)*8-1);
int ret = a;
while( (c>>=1) && (!(b&c)) );
while( c >>= 1 ){
ret <<= 1;
if( c&b )
ret = add(ret, a);
}
return ret;
}
对于除法
比如12/4
12 -4*2- 4*1 = 0
只要用12减去4的各种2次幂。
以下也只实现了正数的除法
int pos_div(int a,int b)
{
int temp = 1;
int ret = 0;
//a==b
if(!(a^b)) return 1;
//a<b
if(!IsBig(a,b)) return 0;
//a>b
while(!IsBig(temp,a)) temp <<=1 ;
while(IsBig(temp,b))
{
ret <<= 1;
temp >>= 1;
if(!IsBig(temp,a))
{
ret = add(ret,1);
a = sub(a,temp);
}
}
return ret;
}