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

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

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,与我们高中学的数学知识差不多

未完待续...

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

  1. 小白的CTF学习之路3——二进制数据基础与运算(下)

    处理了二进制的整数运算,下面我们来进行令人绝望的浮点数运算 我们先来看一下float事列程序: #include<"stdio.sh"> int main() { fl ...

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

    刚刚注册了这个博客园,尽量保持每日一更(*/ω\*) 今天看了po学院的教学视频,了解了程序是什么,如何在CPU当中工作的等各种之前未曾想过的问题,特此记录,以防忘记 首先我们学习程序与CPU之前需要 ...

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

    明天要进行二模考试了,沉住气,加油,能过 内存是学C路上必不可少的一环,一定要非常认真的去学 内存的物理结构: ROM:只读内存——早期的手机 RAM:读写(数据断点既消) DRAM:经常更新 SRA ...

  4. 小白的CTF学习之路8——节约内存的编程方式

    今天第二更,废话不说上干货 上一章我们学习了内存和cpu间的互动方式,了解到内存的空间非常有限,所以这样就需要我们在编程的时候尽可能的节省内存空间,用最少的空间发挥最大的效果,以下是几种节约内存的方法 ...

  5. 小白的CTF学习之路7——内存与硬盘

    前天去网吧跟朋友包宿,导致昨天一整天都报废,今天早上研究了一下nethunter导致手机成功变砖,感冒不停地咳嗽,这些理由应该足够我前两天拖更了吧,下面开始正题 磁盘学习路线 虚拟缓存 虚拟内存 节约 ...

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

    刚才考了自己一次,下面我把题和答案放到下面 CPU中不含有以下选项中的  C A:     运算器 B:      寄存器 C:     内存 D:     时钟 这是一道送分题,CPU包含以下几种原 ...

  7. 小白的CTF学习之路5——内存的逻辑结构

    很衰的一天,各种意料之外的问题,但都挡不住我每日一更的步伐 内存的逻辑结构大致分为以下几种: 数组 栈与队列 链表 二叉树 以上,数组,栈,链表是我这章要说明的 在学习前需要了解的两个问题: 1.内存 ...

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

    原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方 ...

  9. 新手小白的Linux学习之路

    大家好,我是一个零基础的新手小白,在此和大家分享一下新手小白的学习之路.欢迎各位大神指教!谢谢 Linux简介: Linux操作系统诞生于1991年10月,由芬兰赫尔辛基大学的在校生Linus Tor ...

随机推荐

  1. python之路——10

    王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594 复习 a.函数可读性强,复用性强 def 函数名() 函数体 return 返回值 函数先定义后执行, b. ...

  2. 并发之java.util.concurrent.atomic原子操作类包

    15.JDK1.8的Java.util.concurrent.atomic包小结 14.Java中Atomic包的原理和分析 13.java.util.concurrent.atomic原子操作类包 ...

  3. 【Selenium】各种方式在选择的时候应该怎么选择

    最后再总结一下,各种方式在选择的时候应该怎么选择: 1. 当页面元素有id属性时,最好尽量用id来定位.但由于现实项目中很多程序员其实写的代码并不规范,会缺少很多标准属性,这时就只有选择其他定位方法. ...

  4. [java,2017-05-16] java中清空StringBuffer的方法以及耗费时间比较

    java中清空StringBuffer的方法,我能想到的有4种: 1. buffer.setLength(0);  设置长度为0 2. buffer.delete(0, buffer.length() ...

  5. leetCode26.删除排序数组中的重复项

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示例 1 ...

  6. Java double 加、减、乘、除

    double类型的数值接相加的时候,结果可能出现精度误差为此Java提供了高精度计算的方法:java.math.*里面提供了BigDecimal类 import org.junit.Test; imp ...

  7. kettle实现多表同步

    本样例实现源库的所有表到目标库的同步sqlserver=>mysql(目标表存在表结构则同步),总调度如下: 由于复制记录到结果保存了多个表名,存在多个值,在高级选择对每个输入行执行一次进行循环 ...

  8. sendmail报错Relaying denied

    配置好sendmail后,使用php的mail()发送邮件,出现 SMTP server response: 550 5.7.1 Relaying denied. IP name lookup fai ...

  9. Linux命令:readonly

    readonly [-aAf] [name[=value] ...] or readonly -p -A 表示后面的name变量都是关联数组 -a 表示后面的name变量都是index数组 -f 表示 ...

  10. typedef typename

    所以根据上述两条分析,  typedef typename RefBase::weakref_type weakref_type; 语句的真是面目是: typedef创建了存在类型的别名,而typen ...