不用加减乘除运算符计算两数之和及a=b*3
IT公司的题目如下:
1.不用加减乘除运算符计算两个数字之和
2.不用加减乘除运算符计算a = b * 3
首先这两个题目其实是很相关的,要计算
a = b * 3就是计算a = b *2 + b即a = b << 1 + b。
因此只要解决了不用加减乘除运算符计算两个数字之和,那么不用加减乘除运算符计算a = b * 3也就迎刃而解了。那么怎么不用加减乘除运算符计算两个数字之和了?我们知道在计算5 + 9时,首先不进位的话 5 + 9 = 4,5 + 9的进位为1,然后和就是1 * 10 + 4 = 14。同理放到二进制中也可以采用这样的方法。
运算步骤如下:
设有a = 3,b = 6。
a 0011
b 0110
不进位和 0101 = 5
进位 0010 = 2
因此 a + b就变成了5 + 2 << 1
然后有
5 0101
2<<1 0100
不进位和 0001 = 1
进位 0100 = 4
因此 a + b就变成了1 + 4 << 1
然后有
1 0001
4<<1 1000
不进位和 1001 = 9
进位 0000 = 0
当时进位为0时,不进位和为9即a + b之和。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int BitAdd(int a,int b)
{
int nCarry=a&b;
int nSumNoCarry=a^b;
if(nCarry!=0)
return BitAdd(nSumNoCarry,nCarry<<1);
else
return nSumNoCarry;
}
int BitMultiplication(int a)
{
return BitAdd(a<<1,a);
}
int main()
{
srand(time(NULL));//随机产生种子
const int MAXNUMBER=100;
int a=rand()%MAXNUMBER,b=rand()%MAXNUMBER;
printf("\n ---------位操作之加法------------");
printf("%d+%d=%d\n",a,b,BitAdd(a,b));
printf("\n ---------位操作之a=b*3------------");
printf("%d*3=%d\n",a,BitMultiplication(a));
return 0;
}
#include<stdlib.h>
#include<time.h>
int BitAdd(int a,int b)
{
int nCarry=a&b;
int nSumNoCarry=a^b;
if(nCarry!=0)
return BitAdd(nSumNoCarry,nCarry<<1);
else
return nSumNoCarry;
}
int BitMultiplication(int a)
{
return BitAdd(a<<1,a);
}
int main()
{
srand(time(NULL));//随机产生种子
const int MAXNUMBER=100;
int a=rand()%MAXNUMBER,b=rand()%MAXNUMBER;
printf("\n ---------位操作之加法------------");
printf("%d+%d=%d\n",a,b,BitAdd(a,b));
printf("\n ---------位操作之a=b*3------------");
printf("%d*3=%d\n",a,BitMultiplication(a));
return 0;
}
参考:http://blog.csdn.net/morewindows/article/details/8710737#comments