只用位运算实现加法

Posted on 2012-10-13 20:37  真实的幻术师  阅读(771)  评论(2编辑  收藏  举报

我的想法想法比较简单,没有什么优化。

考虑加数和被加数的二进制位,逐位取异或运算,然后用得到的结果与进位取异或。

对于新产生的进位可以考虑加数,被加数和当前进位的值进行判断,如果这三个数中有2个以上为1,则新的进位就是1.否则就是0

编写代码时注意,因为!=和==的优先级比位运算的优先级高,所以位运算要在括号里

代码如下:

#include<stdio.h>
#include<stdlib.h>
void main()
{
	int n,m;
	int jin = 0x0000;
	int weishu = 0x0001;
	int he = 0,t;
	int n1,m1;
	int i;
	int tjin;
	scanf("%d%d",&n,&m);
	while(weishu)
	{
		n1 = n&weishu;
		m1 = m&weishu;
		t = n1^m1;
		t = t^jin;
		tjin = 0;
		//只要n1,m1,jin中有两个以上1,则进位就是1

		//注意因为!=和==的优先级比位运算的优先级高,所以位运算要在括号里
		if( (n1&m1&jin)!=0)//三个1
		{
			tjin = weishu<<1;
			//printf("one\n");
		}
		else
		{
			if( (n1^m1^jin) == 0 && (n1|m1|jin) != 0)
			{
				tjin = weishu<<1;
			}
		}
		jin = tjin;
		he = he|t;
		weishu = weishu<<1;
	}
	printf("%d\n",he);
	system("pause");
}

  

Copyright © 2024 真实的幻术师
Powered by .NET 8.0 on Kubernetes