栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

位运算符实现加法和乘法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

位运算符实现加法和乘法

文章目录
    • 加法:
    • 乘法:
      • 问题1:
      • 问题2:

加法:
#include 
using namespace std;
int main()
{
	int x, y;
	cin >> x >> y;
	int z = x ^ y;
	int d = x & y;
	int ands;
	if (d) {
		while (d) {
			int end = (d << 1);
			 ands = (end ^ z);
			d = (end & z);

		}
		printf("%d",ands);
	}
	else {
		printf("%d", z);
	}
  
}

异或本身就是不进位的加法,用异或之后然后进行是否有需要进位的判断,如果需要进位的话,那么进行左移一位(因为进位是进前一位),进位完后,进行异或相加,加完之后需要再次判断是否有进位(因为一次相与只判断一次相加进位),并不能代表进位一次后不存在第二次进位,或者第三次比如:二进制1111+0001,就需要进位4次

乘法:
#include 
using namespace std;
int main()
{
	int x, y,z,input,inputs;
	cin >> input >> inputs;
	x = inputs;
	y = inputs;
	for (int i = 0; i  

乘法的问题有点多的,我调了半小时,问题如下:

问题1:
z = (end ^ z);

这行代码起初我直接用个新的ands变量来接收,那样的话,第二次异或的时候仍然异或的是z = x ^ y;这个变量,那样的话,只异或一次是对的,异或两次以上,直接出错

问题2:
				d = (end & z);
				z = (end ^ z);

这两行代码顺序不能颠倒,颠倒之后算出值为负数,因为循环指定是d值判断,d又是靠之前的z值,而不是计算后的z值

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/290946.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号