比较有意思的几个题:
1.题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。
2.不用四则运算计算俩个数的积。
3.计算一个数化为二进制中含有1的个数。
4.对一个32位的数循环右移,返回结果。
/*
1.不用四则运算计算俩个数的和。
比如是如何得出5+17=22这个结果的。实际上,
我们可以分成三步的:
第一步只做各位相加不进位,此时相加的结果是12(个位数5和7相加不要进位是2,十位数0和1相加结果是1);
第二步做进位,5+7中有进位,进位的值是10;
第三步把前面两个结果加起来,12+10的结果是22,刚好5+17=22。
*/
int Add(int x,int y)
{
if(y==0)
return x;
int tmp=x^y;//这里是不含进位的加法。0+0=0,0+1=1,1+0=1,1+1=0.可见不含进位的加法其实就是俩个数的异或。
int tp=(x&y)<<1;//这里是只计算进位后的值。0+0=0,0+1=0,1+0=1,1+1=1.可见只有俩个都是1的时候才进位。由于要进位,所以还要向左移动一位。
return Add(tmp,tp);//然后将计算的进位和不含进位的和加起来。
}
/*
2.不用四则运算计算俩个数的积。
不用四则运算的话,还是要考虑位运算。
比如2*15 (2)=0010 (15)=(1111);
那么其实2*15=(0010)<<0+(0010)<<1+(0010)<<2+(0010)<<3;
换成移位操作。
*/
int Multiplay(int x,int y)
{
int sum=0;//这个是要返回的
int count=0;//这个是记录现在是在哪个位
while(y)
{
if((y&1)==1)
sum+=x<<count;//如果当前位是1,那么说明需要移位。否则不用移位。
y=y>>1;//y右移取数,直到y等于0.
count++;//位数增加
}
return sum;
}
/*
3.计算一个数化为二进制中含有1的个数。
*/
int BitCount(int x)
{
int count=0;
while(x)
{
if((x&1)==1)
count++;
x=x>>1;
}
return count;
}
/*
4.对一个32位的数循环右移,返回结果。
*/
unsigned int RotateRight(unsigned int x,unsigned int y)
{
for(int j=y;j>0;j--)
{
int i=0;
if((x&1)==1)
i=1<<31;
x=x>>1;
x+=i;
}
return x;
}