CPU中的二进制数据(整数篇)

Wesley13
• 阅读 729

1.用二进制数表示计算机信息的原因

计算机内部CPU和内存都是IC的一种,它们都有多个引脚。IC的所有引脚,只有直流电压0V或5V两个状态。也就是说,IC的一个引脚,只能表示两个状态。IC的这个特性,决定了计算机的信息数据只能用二进制数来处理。计算机处理信息的最小单位——位,就相当于二进制中的一位。

对于用二进制数表示的信息,计算机不会区分它是数值,文字,还是某种图片的模式等,而是根据编写程序的各位对计算机发出的指示来进行信息的处理。

2.什么是二进制数(略)

3.移位运算和乘除运算的关系

移位运算指的是将二进制数值的各数位进行左右移位的运算。移位有左移和右移两种。

移位操作使最高位或最低位溢出的数字直接丢弃就可以了。

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

4.1表示负数的方法:

计算机在做减法运算时,实际上内部是在做加法运算。用加法运算来实现减法运算。为此,在表示负数时就使用“二进制的“补数”。补数就是用正数来表示负数。

为了获得补数,我们需要将二进制数的各数位的数值全部取反,然后再将结果加1。原理是:“将二进制数的值取反后加1的结果,和原来的值相加,结果为0”

需要注意的一点:当运算结果为负数时,计算结果的值也是以补数的形式表示的。例如3-5这个运算,用8位二进制数表示3时是00000011,而5=00000101的补数取反加1,也就是11111011。因此3-5其实就是00000011+11111011的运算,运算结果为11111110,最高位变成了1。这就表示结果是一个负数。那么通过求解补数的补数,就可知该值的绝对值。因此11111110的补数,取反加1后为00000010。这个是2的十进制数。因此,11111110表示的就是-2。我们就得到了3-5的正确结果。

5.逻辑右移和算术右移的区别

算术右移:将二进制作为带符号的数值进行运算时,移位后要在最高位填充移位前符号位的值(0或1).这就是算术右移。

只有在右移时才必须区分逻辑位移和算术位移。左移时,无论时图形模式(逻辑左移)还是相乘运算(逻辑右移),都只需要在空出来的低位补0即可。

下面顺便介绍以下符号扩充。以8位二进制数为例,符号扩充就是指在保持值不变的前提下将其转换成16位和32位的二进制数。将01111111这个正的8位二进制数转换成16位二进制数时,很容易就能得出0000000001111111这个正确结果,但是像11111111这样用补数来表示的数值,该如何处理比较好呢?实际上将其表示成1111111111111111就可以了。也就是说,不管时正数还是用补数表示的负数,都只需用符号位的值(0或1)填充高位即可。这就是符号扩充方法。

6.逻辑运算

逻辑运算是指对二进制数各数字位的0和1分别进行处理的运算,包括逻辑非(NOT运算),逻辑与(AND运算),逻辑或(OR运算)和逻辑异或(XOR运算)四种。

对于逻辑运算,我们需要一个整体的把握:

逻辑非:是所有位的取反操作

逻辑与:是将一部分变为0(复位到0)的操作

逻辑或:是将一部分变为1(复位到1)的操作

逻辑异或:是将一部分进行取反(相同取0,不同取1)的操作

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java常用类(2)
三、时间处理相关类Date类:计算机世界把1970年1月1号定为基准时间,每个度量单位是毫秒(1秒的千分之一),用long类型的变量表示时间。Date分配Date对象并初始化对象,以表示自从标准基准时间(称为“历元”(epoch),即1970年1月1日08:00:00GMT)以来的指定毫秒数。示例:packagecn.tanjian
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Unity横屏
Android下发现Unity里面的Player设置,并不能完全有效,比如打开了自动旋转,启动的时候还是会横屏,修改XML添加以下代码<applicationandroid:icon"@drawable/ic\_launcher"                    android:label"@string/app\_name"
Wesley13 Wesley13
3年前
Oracle一张表中实现对一个字段不同值和总值的统计(多个count)
需求:统计WAIT\_ORDER表中的工单总数、未处理工单总数、已完成工单总数、未完成工单总数。表结构:为了举例子方便,WAIT\_ORDER表只有两个字段,分别是ID、STATUS,其中STATUS为工单的状态。1表示未处理,2表示已完成,3表示未完成总数。 SQL:  1.SELECT   2
Stella981 Stella981
3年前
ASCII,Unicode和UTF
一、ASCII码我们知道,计算机内部,所有信息最终都是一个二进制值。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从00000000到11111111。上
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这