不使用乘号 除号 计算两个数字的乘 和 除

本文介绍了一种不使用乘法(*)和除法(/)运算符来实现两个整数相乘和相除的方法。通过位操作和加法实现了乘法函数,通过减法实现了除法函数,并考虑了溢出情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

</pre><pre>

//不使用*操作符,计算两个int类型的乘法
int MySystem::Multi(int x1, int x2)
{
	//先将其转换为大数,因为INT_MAX 的绝对值不能转换为INT_MIX,转换的结果的为INT_MAX+1,这将导致正溢出,变为负值 INT_MIN
	long long Lx1 = static_cast<long long>(x1);
	long long Lx2 = static_cast<long long>(x2);
	//判断两个结果是正数还是负数
	int sign = 1;
	if ((Lx1 < 0) ^ (Lx2 < 0))
	{
		sign = -1;
	}
	Lx1 = abs(Lx1);
	Lx2 = abs(Lx2);
	long long Result = 0;
	//讲Lx2分解成2的倍数,因为左移一位,相当于乘以2
	while (Lx2)
	{
		int temp = 1;
		int Cut = 0;
		while ((temp <<= 1) < Lx2)
		{
			Cut += 1;
		}
		Lx2 -= (temp >> 1);
		Result += (Lx1 << Cut);
	}
	if (sign*Result<INT_MIN || sign*Result>INT_MAX)
	{
		return INT_MAX;
	}
	return int(sign*Result);
}

//不使用/操作符,计算两个int类型的除法
int MySystem::Divide(int x1, int x2)
{
	//先将其转换为大数,因为INT_MAX 的绝对值不能转换为INT_MIX,转换的结果的为INT_MAX+1,这将导致正溢出,变为负值 INT_MIN
	long long Lx1 = static_cast<long long>(x1);
	long long Lx2 = static_cast<long long>(x2);
	//判断两个结果是正数还是负数
	int sign = 1;
	if ((Lx1 < 0) ^ (Lx2 < 0))
	{
		sign = -1;
	}
	long long Result = 0;
	while (Lx2<=Lx1)
	{
		long long Cur = 1;
		long long temp = Lx2;
		while ((temp<<=1)<=Lx1)
		{
			Cur <<= 1;
		}
		Result += Cur;
		Lx1 -= (temp >> 1);
	}
	if (sign*Result<INT_MIN || sign*Result>INT_MAX)
	{
		return INT_MAX;
	}
	return int(sign*Result);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值