需要熟练掌握一些常见的位操作实现,具体为:
1)常用的等式:-n=~(n-1)=~n+1
2)获取整数n的二进制中最后一个1:n&(-n)或者n&~(n-1)如:n=010100,则-n=101100,n&(-n)=000100
3)去掉整数n的二进制中最后一个1:n&(n-1),如:n=010100,n-1=010011,n&(n-1)=010000
由于我们不能使用任何算术运算符,因此可供我们使用的就只有位运算符了。 于是我们把操作数看成二进制表示,然后对它们做类似的操作:
实现代码:
int add(int a,int b)
{
int carry,add;
do{
add=a^b;
carry=(a&b)<<1;
a=add;
b=carry;
}while(carry!=0);
return add;
}
减法和容易地转换为加法:a-b=a+(-b)=a+(~b+1)
int subtract(int a,int b)
{
return add(a,add(~b,1));
}
乘法的实现可以转换成:k31*(2^31)+k30*(2^30)+...+k2*(2^2)+k1*(x^1)+k0*(x^0);其中k0~k31取0或者1
//正整数的乘法
int multiply(int a,int b)
{
int ans=0;
while(b)
{
if(b&1)
ans=add(ans,a);
a=a<<1;
b=b>>1;
}
return ans;
}
int divide(int a,int b)
{
int count=0;
while(a>=b)
{
a=subtract(a,b);
count=add(count,1);
}
return count;
}
原文:http://www.cnblogs.com/wuchanming/p/4359341.html