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

 
  

//不使用*操作符,计算两个int类型的乘法
int MySystem::Multi(int x1, int x2)
{
	//先将其转换为大数,因为INT_MAX 的绝对值不能转换为INT_MIX,转换的结果的为INT_MAX+1,这将导致正溢出,变为负值 INT_MIN
	long long Lx1 = static_cast(x1);
	long long Lx2 = static_cast(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*ResultINT_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(x1);
	long long Lx2 = static_cast(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*ResultINT_MAX)
	{
		return INT_MAX;
	}
	return int(sign*Result);
}


你可能感兴趣的:(深入理解计算机操作系统)