二进制的运算法则
二进制
计算机中的数据都是以二进制形式存储和处理的。二进制是一种只包含0和1的数字系统,它是计算机科学的基础。而其原因则是二进制是一种简单的逻辑系统,易于实现和处理,另外,二进制的运算规则也相对简单,同时在物理特性上计算机是由大量的电子元件组成的,这些电子元件通常只有两种稳定的状态。例如,晶体管可以处于导通(表示 1)和截止(表示 0)两种状态;电容器可以充电(表示 1)和放电(表示 0),二进制数字在存储和传输过程中也具有优势。由于二进制数字只有两种状态,0 和 1,可以用高电平和低电平、有磁和无磁、有光和无光等方式来表示。
概念
二进制只包含0和1,由低位到高位是“逢二进一”的。即1+1=10,进而1111+1=10000。
与十进制的转化
使用幂次法。任何十进制数都可以表示为$2^n$+$2^m$+…+$2^0$的形式。
如 “3=$2^1$+$2^0$”,”5=$2^2$+$2^0$”,”10=$2^3$+$2^1$”
于是我们以位来代替幂次,即每一位代表2的该位次幂,就可以使$11111_2$表示$31_{10}$,$10101_2$表示$21_{10}$。
加减乘除
加法规则
$0_2+0_2=0_2$
$0_2+1_2=1_2$
$1_2+0_2=1_2$
$1_2+1_2=10_2$
乘法规则
$0_2*0_2=0_2$
$0_2*1_2=0_2$
$1_2*0_2=0_2$
$1_2*1_2=10_2$
二进制乘法计算主要有以下几种方法:
移位相加法
确定被乘数和乘数:
明确要进行乘法运算的两个二进制数,比如被乘数是 1010,乘数是 110。
初始化结果为 0:
把最终结果初始化为二进制的 0。
逐位处理乘数:
从乘数的最低位开始,依次检查每一位。
如果当前位为 1,则将被乘数左移相应的位数,并将结果与当前的部分积相加;如果当前位为 0,则不进行任何操作。
例如对于上述例子,首先检查乘数 110 的最低位是 0,此时不做任何操作。接着检查第二位是 1,将被乘数 1010 左移一位得到 10100,并与当前结果(初始为 0)相加,结果变为 10100。最后检查最高位是 1,将被乘数 1010 左移两位得到 101000,并与当前结果 10100 相加,得到最终结果 111100。
阵列乘法器方法
- 构建乘法阵列:
对于两个 n 位的二进制数 A 和 B,构建一个 n×n 的阵列。
阵列的每一行对应被乘数 A 的一位,每一列对应乘数 B 的一位。 - 计算乘积项:
在阵列的每个交叉点处,如果被乘数的相应位和乘数的相应位都是 1,则放置一个 “1”,否则放置一个 “0”。
这样,每个交叉点的值就是被乘数和乘数相应位的乘积。 - 累加乘积项:
从阵列的最低位开始,逐行进行累加。
通过进位传递和加法操作,将每一行的乘积项与上一行的进位相加,得到最终的乘积结果。
例如对于两个 4 位二进制数 1101 和 1011:
构建的阵列中,第一行与第一列交叉点为 1(因为被乘数的最低位和乘数的最低位都是 1),第二行与第二列交叉点为 1(被乘数的第二位和乘数的第二位都是 1)等。
从最低位开始累加,经过进位传递和加法操作,最终得到乘积结果 10001111。
- 构建乘法阵列:
减法规则
$0_2-0_2=0_2$
$0_2-1_2=1_2$
$1_2-0_2=1_2$
$1_2-1_2=0_2$
你会注意到,$0_2-1_2=1_2$这一条,这是因为二进制中负数采用补码表示
补码
补码(英语:2’s complement)是一种用二进制表示有符号数的方法,也是一种将数字的正负号变号的方式,常在计算机科学中使用。补码以有符号比特的二进制数定义。
正数和0的补码就是该数字本身再补上最高比特0。负数的补码则是将其绝对值按位取反再加1。
补码系统的最大优点是可以在加法或减法处理中,不需因为数字的正负而使用不同的计算方式。只要一种加法电路就可以处理各种有号数加法,而且减法可以用一个数加上另一个数的补码来表示,因此只要有加法电路及补码电路即可完成各种有号数加法及减法,在电路设计上相当方便。
对于一个二进制数,取反操作是将每一位上的数字 “0” 变为 “1”,“1” 变为 “0”。
摘自Wikipedia
以下用4位的补码数字来说明补码系统的数字表示方式。
在表示正数和零时,补码数字和一般二进制一样,唯一的不同是在补码系统中,正数的最高比特恒为0,因此4位的补码正数,最大数字为0111 (7)。
补码数字的负数,最高比特恒为1,4位补码的数字中,最接近0的负数为1111 (-1),以此类推,因此绝对值最大的负数是1000 (-8)。
你有没有想过,要是1000 (-8)再减1,得到的是1111 (-1),这和正数的补码一样,这是为什么呢?
溢出
在二进制计算中,当计算结果超出了所使用的数据类型能够表示的范围时,就会发生溢出。
实验
#include <stdio.h>
int main()
{
//char 1 字节 - 128 到 127 或 0 到 255
char a = 255;
char b = 1;
char c = a + b;
printf("%d",c);
}
除法规则
在二进制中,除法运算通常是通过移位和减法来实现的。
- 标题: 二进制的运算法则
- 作者: 404joker404
- 创建于 : 2024-09-30 19:42:17
- 更新于 : 2024-10-01 12:29:09
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。