第二章 数据是用二进制数表示的

2.1  计算机使用二进制表示信息的原因

本质原因是计算机内部的一个名为IC(集成电路)的硬件特性造成的,一个IC由8个引脚构成,每个引脚只有两个状态,高电压通过时为5V,低电压通过时为0V。我们把这个高电压用1表示,低电压用0表示,因此,IC的这一属性造就了计算机只能使用二进制表示信息。

 由上图可知 1个字节 = 8 位(二进制数),计算机处理信息是以字节为基本单位的,与之对应的位则是最小的单位。所以,我们平时所说的计算机的操作系统的类型的位数都是8的倍数,如广为所指的32位计算机和64位计算机。如果 所要处理的字节数 < 存储数据的字节数 时,进行高位补0操作。

 

2.2  什么是二进制数

在讲解二进制数之前,我们先来回顾一下将十进制数转换成二进制数的过程,比如将十进制数25转换成二进制数的方法就是不断除2取余,直到商为0时从下往上排列余数即可。

 而二进制数转换成十进制的方法是:将二进制数各个位数上的数值和位权相乘,然后将相乘的结果相加即可。此处有一个新的术语——“位权”,大家莫怕,我们仍以十进制数25所表示的二进制数11001为例为大家讲解这个过程。其中,绿色字体的部分即为位权。

但是为什么是这样计算的呢?其实我们可以通过十进制数来理解二进制数转换成十进制数的方法可能会更容易一些。比如,十进制数25就是

25 = 2*10^1 + 5*10^0,其实原理都是一样的,换了一种思维方式而已。

2.3  移位运算和乘除运算的关系

我们先来认识两个运算符:分别是左移运算符 << 右移运算符 >>,这段代码的意思就是将25左移两位后的值输出,大家知道结果是多少吗?

 

1 int main()
2 {
3     int a = 25;
4     int b = a << 2;
5     printf("%d\n", b);
6     return 0;
7 }

 

正确的答案应该是100,为什么呢,计算机又是如何对其进行计算的呢?为了简便演示,下边以8位的计算机进行解析:

 25-->左移两位-->100,刚好是2^2。只是巧合吗,不不不,其实二进制数左移一位、两位、三位..会变成原数的2倍、4倍、8倍,同理,右移会变成原数的1/2,1/4,1/8。二进制的左移是比较简单的,我们只用记住溢出位忽略不计,低位空出来的补0就行。

2.4  便于计算机处理的“补数”

这个地方的“补数”也就是我们常说的“补码”,既然提到补码这一概念了,与此就介绍一下整数在计算机里边的三种表示形式,分别是原码10进制数所对应的二进制数序列)、反码符号位不变,其他位按位取反)和补码反码+1),但是有一点需要注意的是,这一系列操作是针对于负数而言的,对于正数,它的 原码 = 反码 = 补码,而在内存中进行计算的是补码例如,我们求一下 -1 的补码(为了方便,下边仍以8位计算机为例):

 为什么要使用“补码”这个东西呢?原因是计算机相当于一个只会计算加法的加法器,对于两个正数相加还好说,而对于两个符号相反的数相加可就麻烦了,而补码的这个特性刚好能解决这个问题,下边我们就通过实操来感受一下补码的神奇魅力吧!比如计算1 + (-1):

 结果正是 0,与我们的预期相吻合,读到这里的时候不得不佩服前辈的那些科学家想出来补码这个神奇的东西!

2.5  逻辑右移和算数右移的区别

相对于左移,右移的操作要稍稍复杂那么一丢丢了,读者可小喝一口水,然后我们继续哈。其实左移也分位逻辑左移和算数左移,只是说逻辑左移和算数左移进行的移位操作都是一样的-->忽略溢出位,低位补0。

逻辑右移:空出来的高位补0

算数右移:空出来的高位补符号位

 

补充:符号扩充就是在原值保持不变的情况下将原值转换为16位或者32位二进制数

 例如8位二进制数11100010表示成16进制数就是在高位补符号位 11111111 11100010

2.6  掌握逻辑运算的窍门

逻辑非:0变1,1变0;

逻辑与:1与1为1,其余都为0;

逻辑或:0与0为0,其余都为1;

逻辑异或:相同为0,相异为1.

以下为逻辑运算的真值表:

1.逻辑非(NOT):

A NOT A
0 1
1 0

2.逻辑与(AND):

A B A AND B
0 0 0
0 1 0
1 0 0
1 1 1

3.逻辑或(OR):

A B A OR B
0 0 0
0 1 1
1 0 1
1 1 1

4.逻辑异或(XOR):

A B A XOR B
0 0 0
0 1 1
1 0 1
1 1 0

 以上便是第二章的学习笔记和心得体会,由于毕竟个人技术有限,文中难免有纰漏之处,在此也欢迎各位读者留言批评指正。

posted @   羽梦齐飞  阅读(302)  评论(3编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示