二进制的乘除

本文通过对比十进制乘法,详细解释了二进制乘法的原理及操作步骤,展示了二进制乘法的简洁性,并探讨了负数乘法的处理方式。

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

已经好久没有写博客了,一是因为学院屁事太多了(嘘,吐吐槽就行了,被学院发现会被bb的)二是因为自己确实找不到什么好写的,呼。当然也是因为一直有一个东西困扰我,就是学到二进制时,当时只教了二进制的加减,(什么原码,反码,补码的的东西(小声bb))但是没有教二进制的乘除。在加上老师告诉我们计算机只能进行二进制的加法,所以我就在思考二进制怎么算加减乘除。好了我还是先说明吧。
*

一:乘法

*大家还记得小学我们学九九乘法表的时候,老师当时要求我们必须要背。因为那是我们必须要求掌握的。也没有巧路可以走的在这里,我还是发一张九九乘法表的图片
在这里插入图片描述
那二进制的乘法表是怎样的?
在这里插入图片描述
是不是感觉和十进制有很大的不同,哇,只有一种情况才有1,其他的都是0,那怎样把数给变大?难道101x110=100?这是我当初的思路。后来回顾了十进制怎么算的。我才发现原来二进制可以和十进制一样进行同样的步骤乘除。例如十进制里29x33
在这里插入图片描述
这里我们发现是87+870
那把这个带入二进制里运算7x9呢那又是怎样?
在这里插入图片描述
是不是突然感觉二进制的乘法很简单了?
这里我们可以把1001理解为9;10010理解为18;100100理解为36,然后把这三个相加也就是63;当然也可以直接用二进制的相加为111111也就是十进制的63了,那如果俩个负数相乘呢?或者其中一个是负数呢?这里我将用7x-9;作为示例;(如计算机最大为八位数字,第一位为符号位)
在这里插入图片描述
现在发现是不是二进制的乘法很简单了,只需要算出来然后分别相加就好了。难?为什么难?那是因为这和我们平时的思维逻辑不一样,所以它难。那除法呢?你们自己想吧。十进制是怎么算除法的。二进制当然也一样。
有什么不对的欢迎指出。求大佬鞭策。

### 二进制加法运算方法 二进制加法遵循与十进制加法相似的规则,但仅涉及两个数字(0 和 1),因此加法规则包括: - $0 + 0 = 0$ - $0 + 1 = 1$ - $1 + 0 = 1$ - $1 + 1 = 10$(即进位为 1) 实现时需要考虑进位处理。例如,可以使用循环或递归方式完成加法操作。以下是一个基于位运算的加法实现示例: ```c int add(int num1, int num2) { while (num2 != 0) { int carry = num1 & num2; // 计算进位 num1 = num1 ^ num2; // 不带进位的加法 num2 = carry << 1; // 进位左移一位 } return num1; } ``` 通过不断更新进位和不带进位的加法结果,最终得到完整的加法运算结果 [^1]。 --- ### 二进制减法运算方法 二进制减法可以通过补码的方式实现。具体来说,减法 $a - b$ 可以转化为 $a + (-b)$,其中 $-b$ 是 $b$ 的补码表示。补码的计算方法是将数值取反后加 1。以下是一个实现减法的代码示例: ```c int subtract(int num1, int num2) { int subtractor = add(~num2, 1); // 求减数的补码 int result = add(num1, subtractor); return result; } ``` 此方法利用了加法函数 `add` 来完成补码加法,从而实现减法 [^1]。 --- ### 二进制乘法运算方法 二进制乘法类似于十进制乘法,但简化了许多,因为每一位只能是 0 或 1。基本思路是遍历其中一个数的每一位,如果该位为 1,则将另一个数左移相应的位数并累加到结果中。以下是实现二进制乘法的代码示例: ```c int mul(int a, int b) { bool isNegative = false; if ((a >> 31) ^ (b >> 31)) { // 判断符号是否一致 isNegative = true; } if (a < 0) a = add(~a, 1); // 取绝对值 if (b < 0) b = add(~b, 1); int res = 0; while (b) { if (b & 1) { res = add(res, a); // 如果当前位为1,累加a } a <<= 1; // 左移a b >>= 1; // 右移b } if (isNegative) { res = add(~res, 1); // 如果结果为负数,求补码 } return res; } ``` 在实现过程中需要注意符号问题,并根据符号调整最终结果 [^2]。 --- ### 二进制除法运算方法 二进制除法与十进制除法类似,主要步骤包括比较被除数与除数、减去除数并记录商、以及将余数左移下一位继续处理。以下是实现二进制除法的代码示例: ```c int divide(int dividend, int divisor) { if (divisor == 0) return INT_MAX; // 防止除零错误 long long a = (long long)dividend; long long b = (long long)divisor; bool isNegative = (a < 0) ^ (b < 0); // 判断符号是否一致 a = a < 0 ? -a : a; b = b < 0 ? -b : b; long long result = 0; while (a >= b) { long long temp = b; long long multiple = 1; while (a >= (temp << 1)) { temp <<= 1; multiple <<= 1; } a -= temp; result += multiple; } if (isNegative) { result = -result; } return (int)(result > INT_MAX ? INT_MAX : result); } ``` 此代码通过不断左移除数来寻找最大可减部分,并逐步计算商和余数 [^4]。 --- ### 相关问题 1. 如何通过位运算实现二进制数的取反加一操作? 2. 在二进制乘法中,如何处理负数的情况? 3. 二进制除法中,如何判断中间余数是否足够减去除数? 4. 使用位运算实现加法时,为何需要循环处理进位? 5. 在二进制运算中,左移和右移操作分别对应什么数学意义?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值