位运算实现整数加减乘除(计算机组成原理内容)

位运算实现四则运算
本文介绍如何使用位运算实现整数的加法、减法、乘法和除法等基本算术运算。通过递归和非递归的方法,详细解释了每种运算的具体实现过程。

位运算的题目很多,这个就厉害了,转载博客以学习编程之法。
听同学百度二面中,不准用四则运算操作符来实现四则运算。一想就想到了计算机组成原理上学过的。位运算的思想可以应用到很多地方,这里简单的总结一下用位运算来实现整数的四则运算。
大佬带你看位运算怎么实现四则运算!
加法运算:
int AddWithoutArithmetic(int num1,int num2)
{
if(num2==0) return num1;//没有进位的时候完成运算
int sum,carry;
sum=num1^num2;//完成第一步没有进位的加法运算
carry=(num1&num2)<<1;//完成第二步进位并且左移运算
return AddWithoutArithmetic(sum,carry);//进行递归,相加
}
简化一下:

[cpp] view plain copy
int Add(int a,int b)
{
return b ? Add(a^b,(a&b)<<1) : a;
/*if(b)
return Add(a^b,(a&b)<<1);
else
return a;*/
}
上面的思路就是先不计进位相加,然后再与进位相加,随着递归,进位会变为0,递归结束。

非递归的版本如下:

[cpp] view plain copy
int Add(int a, int b)
{
int ans;
while(b)
{ //直到没有进位
ans = a^b; //不带进位加法
b = ((a&b)<<1); //进位
a = ans;
}
return a;
}
减法运算:

[cpp] view plain copy
//这个和加法一样了,首先取减数的补码,然后相加。
int negtive(int a) //取补码
{
return Add(~a, 1);
}
int Sub(int a, int b)
{
return Add(a, negtive(b));
}
正数乘法运算:

[cpp] view plain copy
//正数乘法运算
int Pos_Multiply(int a,int b)
{
int ans = 0;
while(b)
{
if(b&1)
ans = Add(ans, a);
a = (a<<1);
b = (b>>1);
}
return ans;
}
整数除法(正整数)

[cpp] view plain copy
//除法就是由乘法的过程逆推,依次减掉(如果x够减的)y^(2^31),y^(2^30),…y^8,y^4,y^2,y^1。减掉相应数量的y就在结果加上相应的数量。
int Pos_Div(int x,int y)
{
int ans=0;
for(int i=31;i>=0;i–)
{
//比较x是否大于y的(1<

### 计算机组成原理中的除法实现计算机体系结构中,除法运算是通过一系列基本操作来完成的。这些操作通常由硬件电路或微程序控制下的中央处理器(CPU)执行。 #### 1. 定点除法算法 定点除法可以分为无符号整数除法和带符号整数除法两种情况: - **恢复余数法**:这是一种较为简单的除法方法,在每次迭代过程中计算商的一位,并更新被除数(此时称为部分余数)。如果当前的部分余数小于0,则需要回退一步并将前一位设置为0;否则继续下一轮迭代直到得到完整的商[^1]。 - **不恢复余数法(非还原除法)**:这种方法不需要显式地检查负值并且回溯修正错误的结果。它利用了补码表示的优势来进行更高效的运算过程。 对于上述两种方法而言,都涉及到移位寄存器以及加/减法器等组件配合工作以逐步逼近最终结果。 ```assembly ; 假设我们要做两个8位二进制正整数相除 A / B (A >= B), 结果放在Q, R分别代表商和余数. DIVIDE: MOV AX,A ; 将被除数加载到AX寄存器中 XOR DX,DX ; 清空DX用于保存高字节的数据 DIV BX ; 执行除法指令,BX存放的是除数B ; 商会自动放入AL寄存器内而AH保持不变, ; 同时低16位(DX:AX)会被替换成为新的余数值 ``` #### 2. 浮点除法简介 浮点数的除法则更加复杂一些因为它不仅涉及到了基数间的比例关系还需要考虑指数部分如何变化等问题。IEEE标准定义了一套详细的规格化流程使得不同平台间能够兼容处理这类特殊类型的数值。 具体来说就是先分离出阶码与尾数再依据相应规则调整它们之间的相对位置从而获得正确的答案[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值