计算机中的二进制
经常在有时候看到什么进制什么的 比如二进制 十六进制什么的、、其实也没啥说白了 其实都是在表示一个数而已 只是表示的方式不一样罢了
先来看看十进制:
什么是十进制?也就是我们平时表示数字的方式就是了 比如250表示的是数字二百五 10表示一十 那他为什么要叫做十进制?
因为它是由:0、1、2、3、4、5、6、7、8、9 十个符号来表示的 所以叫做十进制 它是逢十进一 什么意思呢 也就是我要表示0 1 2 3 4 5 6 7 8 9 ..现在要表示十由于没有符号来表示十 这个数字了 所以就向前进一位然后又开始循环 10 11 12 13...19 又到了一个10 所以再进位变成 20 21.... 对于十进制没啥好讲的 因为这个再熟悉不过了 平时生活中很多地方都是用的十进制表示的、、
这里要说的重点是二进制:
上面说了 十进制之所以叫做十进制 是因为有 0 1 2 3 4 5 6 7 8 9 十个符号来表示 所以叫十进制 那么同理的 二进制 就只有两个 0 和 1
十进制是逢十进一 二进制就是 逢二进一 什么意思 比如要表示 0 1 .. 现在要表示二了和十进制一样 由于没有其他符号来表示了 所以就向前进一位 变成了:10 这个不是 十进制的一十 而是二进制的二 那么继续 11 表示 三 要表示4就再向前进位变成:100 五:101 六:110 七:111.....相信这个规律是看懂了
那么如何去看一个二进制数所表示的十进制数呢?
先来看看 一个十进制的 1 如果把它向前移动一位变成了 10 那么就等同于 1 乘以了十 => 1 * 10 = 10 那么向前移动两位变成了100 那么就等同于 1 乘以了两个十 => 1 * 10 *10 = 100(移动n位就是十的n次方)
同理二进制一样 如果把一个 1 向前移动一位变成了 10 那么就等同于 1 乘以了二 => 1 * 2 = 2 那么向前移动两位变成了100 那么就等同于 1 乘以了两个二 => 1 * 2 * 2 = 4(移动n位就是2的n次方)
来看看任意一个十进制 1024 他等价于
=>1000 + 000 + 20 + 4
=>1000 + 20 + 4
=>1 * 10 * 10 * 10 + 2 * 10 + 4 = 1024
那么一个二进制 1011 他等价于
=>1000 + 000 + 10 + 1
=>1000 + 10 + 1
=>1 * 2 * 2 * 2 + 1 * 2 + 1 = 11(十进制)现在来看 一个十进制的数如何把它变成二进制
还是先看十进制1024用十进制怎么表示 (我特么不是废话么就1024啊)
1024/10 = 102 余 4
102/10 = 10 余 2
10/10 = 1 余 0
1/10 = 0 余 1
亲 上面的余数从下向上看连起来是不是就是1024?、、这不是巧合 是有科学依据的1024不就是由 1 0 2 4 这四个符号来表示的么 上面不停的除以10得到的余数就是每个位数上的数字 想一下是不是任何一个数字除以10得到的余数必然是最后一位数上的数字 而除以了10之后 原来的数字必然就少了一个十进位 然后再除以10得到的余数必然是刚才的数第二位上面的数字...后面同理
其实二进制也可以这样干 比如:54
54/2 = 27 余 0
27/2 = 13 余 1
13/2 = 6 余 1
6/2 = 3 余 0
3/2 = 1 余 1
1/2 = 0 余 1
从下向上110110就是54的二进制表示形式
上面相互转换之所以都列举了十进制来说 是因为 其他进制的也都是同样的道理 只是平时用的数字都是十进制的 用十进制来举例比较容易理解一些
同理还有
八进制:0 1 2 3 4 5 6 7 (逢8进1)
十六进制:0 1 2 3 4 5 6 7 8 9 A B C D E F (逢16进1)
八进制不做多讲 因为几乎用不到 十六进制通常用来表示一个内存地址 比如:0x000000AC(0x是十六进制的前缀 通常写程序的时候 你可以这样 int a = 0x0F 或者 int a = 15 两个一个意思 至于其他的前缀 你就自己百度了吧而且 在程序里面 我也就只用过十进制和16进制的表示法 当然有些语言的十六进制可能不是0x来表示比如vb是&H000000AC 前缀有啥用?123这个数 你告诉我是十进制还是八进制还是十六进制?懂了吧、)
十六进制之所以通常用来表示内存地址 我的理解是 因为看起来比较短 比如255 如果你要用二进制来表示的话 那就是 11111111 如果用16进制FF就能表示了 只需要两位 而且感觉也确实比较直观(以上言论纯属个人YY)
继续回到二进制 为什么那么强调二进制是有原因的 因为对于计算机而已 他只认识这个东西 什么意思?比如我现在在这里打上一些字母"ABCDE"计算机他是不知道这个东西是ABCDE的、、他不认识这个东西 他只知道A是个在显示器上应该用尖尖一个东西画出来 计算机是没有思想的 他只认识0和1不认识其他东西了 那为什么0和1认识 而ABCDE就不认识?很简单、、因为计算机内部没有脑子 只有电 是的 是电、、所以在计算机的内部只存在两种状态 通电(1) 和 断电(0) 你就当在电脑的那些电路板上 里面集成了许许多多的小开关 开关通电的时候表示1 断电的时候表示0 而计算机就是用这里0、1的组合来表示任何东西 而计算机可以任意的来操作或者读取这些开关的通电与断电
这里先扯开一下 在计算机中 你知道的计算大小的单位是啥?MB这个知道吧?1MB=1024KB 1KB=1024Byte 1Byte=8Bit 这个8Bit什么意思?就是8位
那8位表示啥意思?刚才不是说了吗你就当计算机里面的那些板子上面有许许多多的开关开关通电的时候表示1 断电的时候表示0 而8bit就表示8个开关 也就是1byte拥有8个开关 那么利用这八个开关1byte可以表示256种状态 00000000 00000001 00000010 00000011...11111111 这样把所有的开关利用起来 他可以表示256中状态(所以你计算机中或者内存卡中的文件大小就是这么来的 要用多少了0、1来表示你对应的文件)
刚才说了 计算机他是不知道啥ABCD的他只知道 0 和 1 既然如此 那么平时在键盘上按下A 电脑是怎么知道按下的A的 他不是只认识 0 和 1 么 是的 因为计算机把所有的东西都用 0 和 1 来表示了 刚才说道数字 用二进制表示数字不用说了 大家都已经知道了 如果说要表示一个字母比如A 那么计算机也会用 0 和 1 来表示他
或许这你就有点郁闷了 0 1 和 ABCD 啥的有啥关系 简直两个东西啊 那如果我把ABCD..编一个号码呢?假设1表示A、2表示B、3表示D....这样呢?事实上也确实如此 在计算机中每个字符都是以编码的形式存在的 只是不是我上面说的1表示A、2表示B...事实上A是用65表示的、B是66.....那为什么不是像我刚才说的从1开始呢?孩子 别单纯了 计算机中又不是只有ABCD还有abcd(小写)还有标点还有12345(是字符的12345)还有汉字 日语、、、、所以说才有传说中的字符集 字符编码 而通常情况下 英文符号一个字节就能表示 因为刚才我说了 1Byte=8Bit=8个开关=可以表示256中状态 而英文的大小写标点符号什么加起来 用1byte表示也足够了 可是中文的汉字就不一样了 汉字加上标点啥的才256个吗? 如果是两个字节 2byte=16bit=16个开关=可以表示65536种状态 那么可以表示中文了不过一个汉字到底占用几个字节 得看你采用的是什么编码表示
既然字符在计算机中也是0和1表示的 那么一堆0和1在计算机中 计算机怎么知道他是表示的一个数字还是一个字符的编码?这个问题就好比250这个数字 我怎么知道他是一个人的身高还是他的体重一样 如果你把它当作一个人的身高那他就是电线杆 如果当作一个人的体重那他就是肉球 而对于计算机内存中的数据 一般都是程序运行的数据 而那些数据是啥得看你的程序是把那些数据当啥来看待(所以编程的时候 才有数据类型啊 int a = 100;string str = "Hello World" 而100直接以01的形式储存在一个4KB内存中 而str则把每个字符的编码保存到一个连续的空间中 然后把空间的起始地址给str变量)
刚才上面说了字符 不只是字符其他所有东西也都是用0和1表示的 比如一段程序 一张图片 都是0和1表示的
比如一张图片 红绿蓝三原色 都知道吧 用这三种颜色可以调出自然界中的任何颜色 而一张图片由像素组成吧?假设我现在定义这样一堆数据
{4byte,4byte,100*100*3byte}
一共10011byte也就是约等于9.77KB
这样一堆数据 而我把这一堆数据当作一张100*100的图片 那么前面两个4byte表示啥呢?
{4byte[宽度],4byte[高度],100*100*3byte}
后面的100*100或许你知道我想要表示一张100*100的图片 那么*3又是什么意思?刚才不是说了吗 任何颜色都可以用R(红)G(绿)B(蓝)表示 那么一个像素 我就用3个字节来分别表示RGB的比例由于图片是100*100的所以占用大小就是100*100*3byte 刚才说了我把这堆数据当图片处理 那么通过前面8byte我就能知道图片的大小而后面的数据就分别是每个像素的RGB 那么有了这些数据就可以表示这张图了 那么我只要和别人预定好数据的格式是什么样子的 别人就能知道我这张图是啥样子的 所以平时才会看到各种各格式的文件啊 而每种文件都有一种文件的格式 是怎么来表示这个文件的 而表示他的全部是数字 而数字则在计算机里面用0和1呈现、、
包括你看到的显示器上面 花花绿绿的图形 电影 音乐 都是用0和1在计算机中表示的
所以不是有个词语叫做 数字化时代 么 所谓数字化就是 神马东西都用数字来将它表示出来 然后放入电子设备(电脑)中 以0和1的形式储存、、、在磁盘 或者 你的内存卡上、、