二进制加减乘除

最重要的,理解十进制的借位和进位.十进制中,由于一个循环是10,所以借1位,就相当于从高位借过来10,也就是常说的借1当10,同时,高位需要减去10(外在体现上是减去1,因为高位已经在高位了).反过来,进1,就等于高位加上10,但因为高位已经在高位了,所以去掉位数考虑,高位实际是加1,也就是常说的进1.

对于二进制来说,是一样的,只不过一个循环是2,所以借1位,就相当于从高位借过来2,也就是常说的借1当2,同时,高位需要减去2(外在体现上是减去1,因为高位已经在高位了).反过来,进1,就等于高位加上2,但因为高位已经在高位了,所以去掉位数考虑,高位实际是加1,也就是常说的逢2进1,这一点与十进制是一样的.

乘法实际就是加法,就是乘数"每个位"个被乘数得到的乘积相加.乘法也有运算法则,与十进制一样,带0的一律等于0,也就是说只有1*1=1,其余都为0.

除法实际就是减法,就是被除数减去除数的某个倍的乘积,然后得余数的过程.而用于二进制中商(也就是倍)只能为0或为1,所以,乘积要么是除数本身,要么是0,这么一来,实际就变成了减去除数本身或0了,也就是二进制减法了.

这就是为什么计算机科学上讲,乘法就是加法,除法就是减法的原因.


以下转自网络

2.3  二进制数的运算
二进制数的运算除了有四则运算外,还可以有逻辑运算。下面分别予以介绍。
2.3.1  二进制数的四则运算
二进制数与十进制数一样,同样可以进行加、减、乘、除四则运算。其算法规则如下:
加运算:0+0=0,0+1=1,1+0=1,1+1=10,#逢2进1;
减运算:1-1=0,1-0=1,0-0=0,0-1=1,#向高位借1当2;
乘运算:0×0=0,0×1=0,1×0=0,1×1=1,#只有同时为“1”时结果才为“1”;
除运算:二进制数只有两个数(0,1),因此它的商是1或0。
1.加、减法运算示例
例如:求(1101)2+(1010)2之和;求(110000)2–(10111)2之差,这两个计算过程分别如图2-12的(a)/(b)所示。

图2-12  二进制数加、减法计算示例
加法运算步骤
图2-12(a)所示的加法运算步骤如下:
(1)首先是最右数码位相加。这里加数和被加数的最后一位分别为“0”和“1”,根据加法原则可以知道,相加后为“1”。
(2)再进行倒数第二位相加。
(3)再进行倒数第三位相加。这里加数和被加数的倒数第二位都为“0”,根据加法原则可以知道,本来结果应为“0”,但倒数第二位已向这位进“1”了,相当于要加“被加数”、“加数”和“进位”这三个数的这个数码位,所以结果应为0+1=1。
(4)最后最高位相加。这里加数和被加数的最高位都为“1”,根据加法原则可以知道,相加后为“(10)2”。一位只能有一个数字,所以需要再向前进“1”,本身位留下“0”,这样该位相加后就得到“0”,而新的最高位为“1”。
通过以上运算,可以得到(1101)2+(1010)2=10111。
减法运算步骤
对于图2-12(b)所示的减法运算,在此专门解释一下。图中的“借位”行中某些位上方有标有“1”,表示该位被借数。具体过程为从被减数的右边第一位开始减去减数,这与十进制数的减法运算一样。在本例中,最低为“0”,由于0减去1,“0”比“1”小,而需要向右数第二位借位,而这里的第二位也为“0”,不够借转,需要继续而向右数第三位,以此类推,最后从右数第五位借得“1”。 下面是具体的去处过程:
(1)首先最后一位向倒数第二位借“1”,相当于得到了(10)2,也就是相当于十进制数中的“2”,用2减去1得1。
(2)再计算倒数第二位,因为该位同样为“0”,不及减数“1”大,需要继续向倒数第三位借“1”(同样是借“1”当“2”),但因为它在上一步中已借给了最后一位“1”(此时是真实的“1”),则倒数第二位目前为1,与减数“1”相减后得到“0”。
(3)用同样的方法倒数第三位要向它们的上一位借“1”(同样是当“2”),但同样已向它的下一位(倒数第二位)借给“1”(此时也是真实的“1”),所以最终得值也为“0”。
(4)被减数的倒数第四位尽管与前面的几位一样,也为“0”,但它所对应的减数倒数第四位却为“0”,而不是前面几位中对应的“1”,它向它的高位(倒数第五位)借“1”(相当于“2”)后,在借给了倒数第四位“1”(真实的“1”)后,仍有“1”余,1–0=1,所以该位结果为“1”。
(5)被减数的倒数第五位原来为“1”,但它借给了倒数第四位,所以最后为“0”,而此时减数的倒数第五位却为“1”,这样被减数需要继续向它的高位(倒数第六位)借“1”(相当于“2”),2–1=1。
(6)被减数的最后一位本来为“1”,可是借给倒数第五位后就为“0”了,而减数没有这个位,这样结果也就是被减数的相应位值大小,此处为“0”。
这样(110000)2–(10111)2最终的结果应该是:011001,最高位的“0”可以舍掉,就得到了11001这个结果。
在二进制数的加、减法运算中一定要联系上十进制数的加、减法运算方法,其实它们的道理是一样的,也是一一对应的。在十进制数的加法中,进“1”仍就当“1”,在二进制数中也是进“1”当“1”。在十进制数减法中我们向高位借“1”当“10”,在二进制数中就是借“1”当“2”。而被借的数仍然只是减少了“1”,这与十进制数一样。
2.乘、除法运算示例
下面再介绍二进制数运算的乘、除法运算示例。如求(1110)2×(0110)2和(1001110)2÷(110)2的结果,计算过程分别如图2-13(a)/(b)所示。
图2-13  二进制数乘、除法计算示例
 乘法运算示例
先看图2-13(a)所示的二进制数乘法运算,其实很简单,我们只要把二进制数中的“0”和“1”全部当成是十进制数中的“0”和“1”即可。根据十进制数中的乘法运算知道,任何数与“0”相乘所得的积均为“0”,这一点同样适用于二进制数的乘法运算。只有“1”与“1”相乘才等于“1”。有了这样两个原则就很容易理解图2-13(a)所示的乘法运算步骤了。下面是具体介绍。
(1)首先是乘数的最低位与被乘数的所有位相乘,因为乘数的最低位为“0”,根据以上原则可以得出,它与被乘数(1110)2的所有位相乘后的结果都为“0”。
(2)再是乘数的倒数第二位与被乘数的所有位相乘,因为乘数的这一位为“1”,根据以上原则可以得出,它与被乘数(1110)2的高三位相乘后的结果都为“1”,而于最低位相乘后的结果为“0”。
(3)再是乘数的倒数第三位与被乘数的所有位相乘,同样因为乘数的这一位为“1”,处理方法与结果都与上一步的倒数第二位一样,不再赘述。
(4)最后是乘数的最高位与被乘数的所有位相乘,因为乘数的这一位为“0”,所以与被乘数(1110)2的所有位相乘后的结果都为“0”。
(5)然后再按照前面介绍的二进制数加法原则对以上四步所得的结果按位相加(与十进制数的乘法运算方法一样),结果得到(1110)2×(0110)2=(1010100)2。
 除法运算步骤
最后看一下图2-13(b)所示的二进制数除法运算。它也与十进制数的除法运算方法一样,但它的商只能是“0”或“1”。在除法运算中还要用到前面介绍的二进制数减法运算方法。具体步骤如下。
说明:因为除数为“110”,有3位,所以在被除数中也至少要有3位(从高位数起)。被除数的高3位为“100”,比除数“110”小,所以要选到前4位(这与十进制数的除法运算规则是一样的),为“1001”。但要注意的是商只能为“0”,或者“1”,而不能是其他数。
(1)首先用“1”作为商试一下,相当于用“1”乘以除数“110”,然后把所得到的各位再与被除数的前4位“1001”相减。按照减法运算规则可以得到的余数为“011”。
(2)因为“011”与除数“110”相比,不足以被除,所以需要向低取一位,最终得到“0111”,此时的数就比除数“110”大了,可以继续除了。同样用“1”作为商去除,相当于用“1”去乘除数“110”,然后把所得的积与被除数中当前四位“0111”相减。根据以上介绍的减法运算规则可以得到此步的余数为“1”。
(3)因为“1”要远比除数“110”小,被除数向前取一位后为“11”,仍不够“110”除,所以此时需在商位置上用“0”作为商了。
(4)然后在被除数上继续向前取一位,得到“110”。此时恰好与除数“110”完全一样,结果当然是用“1”作为商,用它乘以除数“110”后再与被除数相减,得到的余数正好为“0”。证明这两个数能够整除。
这样一来,所得的商(1101)2就是两者相除的结果。


  • 16
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在C语言中,二进制加减乘除运算可以通过位运算符来实现。以下是一些常用的位运算符: 1. 位与运算符(&):对应位上的两个数都是1,结果才为1。 2. 位或运算符(|):对应位上的两个数只要有一个是1,结果就为1。 3. 异或运算符(^):对应位上的两个数不相同,则结果为1,否则结果为0。 4. 取反运算符(~):对每个二进制位取反(0变成1,1变成0)。 以下是一些常见的二进制运算示例: 1. 二进制加法: ```c int a = 0b1010; // 十制数10 int b = 0b1101; // 十制数13 int sum = a ^ b; // 不位相加结果,0b0111(十制数7) int carry = (a & b) << 1; // 位结果,0b1000(十制数8) int result = sum | carry; // 最终结果,0b1111(十制数15) ``` 2. 二进制减法: ```c int a = 0b1101; // 十制数13 int b = 0b1010; // 十制数10 int diff = a ^ b; // 不借位相减结果,0b0111(十制数7) int borrow = ((~a) & b) << 1; // 借位结果,0b0100(十制数4) int result = diff | borrow; // 最终结果,0b1011(十制数11) ``` 3. 二进制乘法: ```c int a = 0b1010; // 十制数10 int b = 0b1101; // 十制数13 int result = 0; while (b != 0) { if (b & 1) { result += a; } a <<= 1; b >>= 1; } ``` 4. 二进制除法: ```c int a = 0b1101; // 十制数13 int b = 0b101; // 十制数5 int quotient = 0; int remainder = 0; for (int i = 31; i >= 0; i--) { remainder <<= 1; remainder |= (a >> i) & 1; if (remainder >= b) { remainder -= b; quotient |= 1 << i; } } ``` 以上是一些常见的二进制运算示例,需要注意的是,在二进制运算时,需要使用二进制数表示,并且在C语言中,整数默认是有符号的,因此需要注意符号位的处理。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值