小白的CTF学习之路2——二进制数据基础与运算(上)

今天的第二更,被我拖到了傍晚,嘿嘿,二进制这方面让本就数学不好的我很头疼,所以研究了一段时间

在学习之前我们先了解几个问题:

32位是几个字节?

  • 01011100对于十进制是多少?
  • 00001111向左位移两位结果是多少?有什么规律?
  • 以补码形式表示的8位二进制数11111111,十进制为多少?
  • 二进制和十进制有什么区别?

在学习前肯定会对问题里的一些属于感到蒙蔽,不要急,按照我写的一步一步往下看,再回头看这些问题,就会迎刃而解

为什么要用二进制?

可能有些人不了解我们放着好好地十进制不用为什么要去用一跟零去表达,在上一章(小白的CTF学习之路1——程序与CPU)我们讲过,计算机是由各种集成电路(IC)组成的,而集成电路上面呢,他有银角,银角只能表达两种状态,一种是通电,一种是不通电,那么通电和不通电就用0和1来表示,0代表0负,1代表5负,(cpu内的晶体管与集成电路是一样的

二进制是如何表达文字,图片,视频和声音的?

这里我们需要知道二进制都能表示些什么:

  • 小数
  • 字符
  • 数值
  • 图片
  • 视频
  • 音频

小数我们先不用管,字符我们可能比较好理解,我们只需将英文字母26个来乘2(大小写),再用52个编号来表达52个字符

那么图片我们是怎样做到的呢?视频呢?音频又是如何做到的呢?

不要急,我们一步一步来看

图片,我们可以举个例子,比如我们想表示A这个字母的图片,我们在一个5X5的格子上,将这个A的形状用黑点来把格子涂黑,而在二进制中呢,我们是一样的,在一个5X5的不通电电路中,用通电来表示图像,这就是我们的点阵法的形象理解,但是,这种方法只能显示黑或白,我们看的图片肯定不是黑白的啊,这怎么办呢?我们可以在此之上,再加上一个表,每个格里面代表一个颜色,这样,我们就很好的解决了颜色的问题,我们常说的8位色,32位色等就是这个意思(8位色可以表示6万多种颜色)

图片我们了解了,视频就相对简单了,视频比图片多了一个叫做轨道的东西,一帧一帧的播放图片

那么怎么表达音频呢?音频是通过采样形成高低波的点,将结果形成一个形式

这就是我们二进制能够表达的东西及原理

以下内容涉及到运算部分

一:二进制和十进制的转换

十进制:逢十进一

二进制:逢二进一

下面是0-5的二进制转换,下面以此类推

  • 0;0
  • 1;1
  • 2;10
  • 3;11
  • 4;100
  • 5;101

具体是怎么运算的呢?可以参考我下面的图片

二:进制的运算(难点)

十进制运算:加减乘除

二进制运算同样可以进行加减乘除

  • 00111+01000=01111
  • 0010011+0010011=0100110

注意逢二进一

二进制减法

二进制当中没有减,只能通过加法来实现

例如:十进制10-5=10+(-5)

二进制:1101-0011=1010

依然是逢二进一的逆运算,简单吧,但是计算机是如何做的呢?

1101+(-0011)

那么我们就出现了一个问题:二进制如何表示负数?

我们知道,计算机里有银角,每个银角存一个二进制的值,那么表示负数我们就规定一个长度(8位,16位,32位),拿它最前面的表示符号,0代表正,1代表负,这样一来,我们的首位代表标志位

我们现在表示了负数,但是我们依旧还是无法用于运算,因为计算机无法理解,这里我们便引入了一个补数的概念

例如:1=0001

补数:取反=1110

+1=1111

1111这个值就代表我们的-1

这里我们需要注意一下,我们需要事先规定好数值的范围,上面的例子的范围就是4,超过4位的计算机就会舍弃,我们的长度规定有:8位,16位,32位,64位

这样我们的补数就可以用于二进制减法运算了

二:二进制的乘或除

左移运算是代表乘法,例如:0001=1X4,左移两位,0100=4,0011=3X2,左移一位0110=6

由此得出结论:每左移几位=X几个2

右移运算代表除法

我们上面的左移运算是用0来补全

0100=4/2,右移一位,0010=2

这样运算ok没问题

但是如果是这种情况:

1000 0000=-128

右移二位

1110 0000=-32

当进行补码后的右移需要把首位跟着它一起右移过去

再举个栗子:

10011100=-100

右移二位

11100111=-25

这样一来,我们的二进制除法工作就已经完成了,右移分为两种,一个是逻辑右移:作为正整数的除,一个是算术右移:根据首位决定补0或1

有人会问,既然算术右移可以实现全部的运算,为什么还要进行逻辑右移呢?我们的逻辑右移可以用来表示整体右移,例如,单片机内的点阵跑马灯,用于动态视频等操作

除了逻辑右移,还有逻辑非,逻辑与,逻辑或,逻辑异或等比较容易的运算

逻辑非就是取反,逻辑与是10得0,11得1,逻辑或是10得1,逻辑异或是10=1,与我们高中学的数学知识差不多

未完待续...

原文地址:https://www.cnblogs.com/xiaoshenlong/p/10659585.html

时间: 2024-10-02 23:05:03

小白的CTF学习之路2——二进制数据基础与运算(上)的相关文章

小白的CTF学习之路1——程序与CPU

刚刚注册了这个博客园,尽量保持每日一更(*/ω\*) 今天看了po学院的教学视频,了解了程序是什么,如何在CPU当中工作的等各种之前未曾想过的问题,特此记录,以防忘记 首先我们学习程序与CPU之前需要了解这么几个问题: 1.什么是程序? 2.程序是由什么组成? 3.什么是机器语言? 3.运行中的程序存储在什么位置? 4.什么是内存地址? 5.程序的解释和运行的计算机部件叫什么? 我们带着问题来学习,将会有很大的效果 首先我们需要了解CPU是什么? CPU(Central Processing U

小白的CTF学习之路4——内存

明天要进行二模考试了,沉住气,加油,能过 内存是学C路上必不可少的一环,一定要非常认真的去学 内存的物理结构: ROM:只读内存——早期的手机 RAM:读写(数据断点既消) DRAM:经常更新 SRAM:不常更新 以上内容了解便可 顾名思义,内存就是我们电脑存放数据的地方,那么他是怎么实现能够存放数据的呢?下面我们来一探究竟 内存同样是有许多集成电路(IC)组成的IC具体是怎么运作的呢?可以看下我下面放出的图片 emmmm,这是我画的一张非常简易的集成电路,大致就是我们电脑内存条的这个部分 看不

小白的CTF学习之路6——阶段测评

刚才考了自己一次,下面我把题和答案放到下面 CPU中不含有以下选项中的  C A:     运算器 B:      寄存器 C:     内存 D:     时钟 这是一道送分题,CPU包含以下几种原件 寄存器 控制器 运算器 时钟 CPU中负责计时的部件是  G E:      程序计数寄存器 F:      时钟 G:     控制器 H:     靠人来计时 其实这个答案我本人也是存疑的,目前网上没有关于这方面的资料,但是肯定不会选F了,时钟是决定CPU运算速度的部件 对于汇编以下说法正确

mybatis学习之路----批量更新数据两种方法效率对比

原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方式有两种, 一种用for循环通过循环传过来的参数集合,循环出N条sql, 另一种 用mysql的case when 条件判断变相的进行批量更新 下面进行实现. 注意第一种方法要想成功,需要在db链接url后面带一个参数  &allowMultiQueries=true 即:  jdbc:mysql:

Python小白学习之路—while、for循环、运算

Python里面的循环跟其他语言里的循环基本一致,只是书写格式不同. 1.for循环: for [循环条件]:[循环语句] 满足循环条件,则执行循环语句,执行一次判断一次,不满足则结束循环. 简单的循环: in range() 表示在什么范围里 1 # 循环 自动累计加一 2 # 一个参数代表从0开始到多少 3 for i in range(10): 4 print("One:",i) 5 # 两个参数代表范围 6 for i in range(0,5): 7 print("

小白的java学习之路 “ 选择结构(二)”

switch 选择结构: 为什么使用switch选择结构: switch选择结构可以更好地解决等值判断问题. switch选择结构的四个关键字: switch    case    default    break switch选择结构语法: switch (key) { case value: break; case value: break; case value: break; default: break; } 根据key去匹配value的值,如果value的值跟key相同则走case块

小白的java学习之路 “ 循环结构(二)”

一.for 循环 语法: for(表达式一;表达式二;表达式三){ 循环操作 } 表达式一:参数初始化 表达式二:条件判断 表达式三:更新循环变量 执行流程: 步骤一:执行表达式一.初始化参数 步骤二:执行表达式二进行循环条件的判断 步骤三:如果循环条件为true则执行循环操作,如果为false则退出循环执行以下代码 步骤四:当循环操作执行完毕后执行表达式三,更新循环变量 表达式三执行完毕后继续执行表达式二进行循环判断,如果为真则执行循环操作,如果为假则执行以下代码,以此类推..........

小白的java学习之路 "类的无参方法"

Java注释: //:单行注释 /**/:多行注释 /** */:JavaDoc注释语法: 访问修饰符 返回值类型 方法名(){ 方法体 } 举例: public void run(){ System.out.println(""); } public String robball(){ String ball="球"; return ball; } 方法的返回值: 1.如果方法具有返回值,方法中必须使用关键字return返回该值,返回值类型为该返回值的类型 ret

小白的java学习之路 “ 字符串”

定一个字符串可以使用string类和stringbuffer类. string类提供了大量的操作字符串的方法,常用的如下: 获得字符串的长度: length(). 比较字符串:equals(). 链接字符串:concat(). 提取字符串:substring(). 搜索字符串:indexOf(). 拆分字符串:spilt(). 常用的stringbuffer类提供的方法如下: 转换成string类型:tostring(). 链接字符串:append(). 插入字符串:intsert(). 一些案