《Java从入门到失业》第一章:计算机基础知识(一):二进制和十六进制
0 前言
最近7年来的高强度工作和不规律的饮食作息,压得我有些喘不过气,身体也陆续报警。2018年下半年的一场病,让我意识到了这个问题的严重性,于是开始强制自己有规律饮食和作息,并辅以健身锻炼,不到2年的时间,长期的腰痛和左肩膀痛竟然无药自愈,慢性胃炎也得到了缓解,于是我下定决心要坚持下去。
2020年一场突如其来的疫情,打乱了我的生活节奏。再由于公司发生了一些事情以及自身的某些原因,终于在37周岁这样一个尴尬的年龄,光荣的失业了。刚开始的十来天,觉得挺美,天天睡到自然醒,顿顿都自己做健身餐,上午看看书,下午健个身,还可以陪孩子学习玩耍;慢慢的发现,这样的日子也不是长(没)久(有)之(收)计(入),想给自己找个事情做做,想了很多,最后觉得自己和Java混了15年,不能浪费啊,虽然称不上高手,但是毕竟还是有15年的苦劳,给刚入门的小同学做个开山师傅还是可以的,因此决定开博客写文章。
既然决定要在网上混了,得有个响亮的名头,思来想去,既然成为了一个大龄失业中年大叔,那就叫“Java大失叔”好了。
1 计算机基础知识
想了很久,不知道从哪个地方开始写起,于是回忆我刚入门那会,是从学习孙鑫老师的视频开始的,依稀记得第一课是讲计算机组成、二进制这些。因此我也打算从这开始,虽然这些东西看起来和Java没啥关系,就当做我的一个情怀好了,也可以给大家增加一些奇怪的知识。如果已经了解的或者不想看的,直接忽略该篇就好。(当然,由于能力有限,只能点到为止,如果特别有兴趣的朋友,请出门右转,参阅更加专业的书籍)
1.1二进制、十六进制
这一小节,先来掌握一些数学知识:二进制和十六进制。为啥要学这个呢?因为计算机只认识2个数字(英文叫digit):0和1,因此在计算机中的数据都是1001001011111100这样的数字串,这其实就是二进制的数字串,就好比我们实际生活当中的十进制数字串:93322415,我们管这个数字串叫数值(英文叫number)
1.1.1十进制
我们先回忆一下什么是十进制?小学生都知道,逢10进1,具体总结如下:
- 一共有0~9共10个数字
- 一个十进制数值由若干个数字组成,数字的数量叫位数,例如3位数988
- 每个位上的数字取值范围为0~9
- 同位的两个数字相加,超过10的部分向高位进一,剩下的部分留在原位,例如9+8=17,这就是逢10进1
- 相邻的2个位,差别是10倍,例如300是30的10倍
生活当中,我们使用的就是十进制数值,例如你们班里有18个漂亮的女生,一年有365天,你的口袋里就剩下5块钱了,我们把这些数字分析一下:
数值 |
百位 |
十位 |
个位 |
分解 |
进一步分解 |
5 |
0 |
0 |
5 |
0*100 + 0*10 + 5*1 |
0*102 + 0*101 + 5*100 |
18 |
0 |
1 |
8 |
0*100 + 1*10 + 8*1 |
0*102 + 1*101 + 8*100 |
365 |
3 |
6 |
5 |
3*100 + 6*10 + 5*1 |
3*102 + 6*101 + 5*100 |
相信大家都看出规律了,废话不多说,总结一下:假设一个十进制数值N,一共有n位,第n位上对应的数字为an,那么N=an*10n-1 + an-1*10n-2 + … + a1*100。太棒了,我们已经总结出一条规律了,呱唧呱唧!
下面我们再来看生活中的一个例子,猜猜下面这个是什么东西?
我相信你们99.99%的人都知道,这是一个记分牌。一开始2边都是000,红队得1分,就变成001,红队最多能变成999。也就是说,一个3位数的记分牌,可以表示000~999共1000个数值,最大的数值是999。我们再列一个表:
位数 |
能表示数值范围 |
能表示数值数量 |
最大数值 |
1 |
0~9 |
10=101 |
9=101-1 |
2 |
00~99 |
100=102 |
99=102-1 |
3 |
000~999 |
1000=103 |
999=103-1 |
OK,规律一目了然:对于n位数,一共有=10n个取值,能表示的最大数值为10n-1。到这里,我们把十进制就搞明白了,可以总结十进制的特点如下:
- 一共有0~9共10个数字
- 每个位上的数字取值范围为0~9
- 同位的两个数字相加,逢10进1
- 相邻的2个位,差别是10倍
- 假设一个十进制数值N,一共有n位,第n位上对应的数字为an,那么N=an*10n-1 + an-1*10n-2 + … + a1*100
- 对于n位数,一共有=10n个取值,能表示的最大数值为10n-1
1.1.2二进制
我们搞明白了十进制的特点,对比着再来理解二进制,so easy!妈妈再也不用担心我的学习了!我们可以直接写出二进制的特点:
- 一共有0~1共2个数字
- 每个位上的数字取值范围为0~1
- 同位的两个数字相加,逢2进1
- 相邻的2个位,差别是2倍
- 假设一个二进制数值N,一共有n位,第n位上对应的数字为an,那么N=an*2n-1 + an-1*2n-2 + … + a1*20
- 对于n位数,一共有=2n个取值,能表示的最大数值为2n-1
好了,二进制的特点有了,那么一个二进制数值1010对应的十进制数值是多少呢?搞懂这个问题前,先解决另外一个问题,就是接下来我们会把十进制数值和二进制数值放在一起讨论,那么每次都说十进制某某、二进制某某,太累了,于是聪明的人类就约定一下,在二进制数值前加上一个符号0b表示这是一个二进制数值,例如0b1010,这样是不是简单多了?下面我们就来研究一下换算问题。
还记得在十进制中,有位的概念,分别是个位、十位、百位、千位等。实际上可以认为是100位、101位、102位、103位。那么在二进制中,我们可以认为是20位、21位、22位、23位。有了这个理论基础,我们就可以看一个二进制数值的拆解表以及对应的十进制数:
数值 |
“百”位 |
“十”位 |
“个”位 |
分解 |
对应十进制数值 |
0b1 |
0 |
0 |
1 |
0*22 + 0*21 + 1*20 |
1 |
0b10 |
0 |
1 |
0 |
0*22 + 1*21 + 0*20 |
2 |
0b101 |
1 |
0 |
1 |
1*22 + 0*21 + 1*20 |
5 |
我们太厉害了,书写问题搞定了,换算问题搞定了,世界是我的了!我们来对比一下十进制和二进制:
对比项 |
十进制 |
二进制 |
数字 |
0~9 |
0~2 |
相邻2个位差别 |
10倍 |
2倍 |
n位数可取数值数量 |
10n |
2n |
n位数表示最大数值 |
10n -1 |
2n -1 |
n位数值公式 |
an*10n-1 + an-1*10n-2 + … + a1*100 |
an*2n-1 + an-1*2n-2 + … + a1*20 |
这个表,大家最好背下来。
1.1.3十六进制
太棒了,我们已经搞明白了二进制,聪明的同学又要问了,计算机中都是0和1,学习了二进制就可以了,为啥要学习十六进制呢?我们先看一个二进制数:1011111110101001110101011000110001,天哪!太长了。发现了吧,二进制在书写上非常不方便,那么有没有方便的书写方法呢?人的聪明再一次体现,答案是:有。用啥?十六进制。为啥?不知道……,就知道你不知道,嘿嘿。上面我们知道,一个4位的二进制数,有几种取值?还记得要背的表吗?答案是24=16种。一个1位十六进数有几种取值呢?相信你可以猜到,答案是161=16种。哇塞,好神奇,都是16,好像找到规律了,对了,就是可以把一个二进制数,4个4个的打包,用一个十六进制数表示,这样就大大的缩短了一个二进制数的书写。接下来,我相信99.99%的同学,都可以列出十六进制的特点了:
l 一共有0~16共16个数字
l 每个位上的数字取值范围为0~16
l 同位的两个数字相加,逢16进1
l 相邻的2个位,差别是16倍
l 假设一个十六进制数值N,一共有n位,第n位上对应的数字为an,那么N=an*16n-1 + an-1*16n-2 + … + a1*160
l 对于n位数,一共有=16n个取值,能表示的最大数值为16n-1
错是没错,但是这里有个小问题,我们的认知世界里,只有0~9共10个数字,那么10~15这是个2位数,我们怎么表示呢?扑克牌,大家都玩过吧,里面的JQK其实就是表示11、12、13。因此,我们也可以用字母来表示,我们一般用A、B、C、D、E、F分别表示10、11、12、13、14、15。前面我们学习过,一个二进制数值前我们会加0b,那么一个十六进制数值前,我们给他加上0x。
在实际运用中,我们会把一个二进制数值的位数补齐为4的倍数,不足时前面补0。例如0b101我们会写成0b0101。同理,我们会把一个十六进制数值的位数补齐为2的倍数,不足时前面补0,例如0xA我们会写成0x0A,0x1FB我们会写成0x01FB。
好了,到此为止,进制的问题我们就讨论完毕了,我们来回答这一小节开始的问题:对于0b1011111110101001110101011000110001,如何用十六进制书写。我数了一下,一共34位,先把位数补齐为4的倍数补到36位:0b001011111110101001110101011000110001,然后从低位到高位,4个一组打包,列表如下:
打包项 |
十进制 |
十六进制 |
0001 |
20=1 |
1 |
0011 |
21+20=3 |
3 |
0110 |
22+21=6 |
6 |
0101 |
22+20=5 |
5 |
0111 |
22+21+20=7 |
7 |
1010 |
23+21=10 |
A |
1110 |
23+22+21=14 |
E |
1111 |
23+22+21+20=15 |
F |
0010 |
21=2 |
2 |
用十六进制书写,就可以书写为:0x2FEA75631,再补齐为2的倍数:0x02FEA75631。
最后,我们插入一个小知识,在计算机中,我们把一个0或1叫做位(bit),8位叫做一个字节(Byte),另外为了物理上的实现方便和运算方便,规定1K=1024,1M=1024K,1G=1024M……。
其次还有一些东西最好能够记住,这样方便以后能够快速学习一些知识,我总结一下:
24=16、25=32、26=64、27=128、28=256、210=1024、216=65536、232=4294967296
《Java从入门到失业》第一章:计算机基础知识(一):二进制和十六进制的更多相关文章
- python第一章计算机基础
第一章 计算机基础 1.1 硬件 计算机基本的硬件由:CPU / 内存 / 主板 / 硬盘 / 网卡 / 显卡 / 显示器 等组成,只有硬件但硬件之间无法进行交流和通信. 1.2 操作系统 操作系统用 ...
- UNIX环境高级编程--第一章 UNIX基础知识
第一章 UNIX基础知识 1.2 UNIX体系结构 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境.我们将这种软件称为内核(kernel),因为 它相对较小,且 ...
- apue学习笔记(第一章UNIX基础知识)
总所周知,UNIX环境高级编程是一本很经典的书,之前我粗略的看了一遍,感觉理解得不够深入. 听说写博客可以提高自己的水平,因此趁着这个机会我想把它重新看一遍,并把每一章的笔记写在博客里面. 我学习的时 ...
- 《码出高效 Java开发手册》第一章计算机基础(未整理)
码云地址: https://gitee.com/forxiaoming/JavaBaseCode/tree/master/EasyCoding
- 第一章 UNIX 基础知识
1.1 Unix体系结构 OS定义为一种软件,它控制计算机硬件资源,提供程序运行环境,一般称其为内核(kernel),它体积小,位于环境中心. 内核的接口为系统调用(system call),共用函数 ...
- HTML5 Canvas核心技术图形动画与游戏开发(读书笔记)----第一章,基础知识
一,canvas元素 1 为了防止浏览器不支持canvas元素,我们设置“后备内容”(fallback content),下面紫色的字即为后备内容 <canvas id="canvas ...
- Python 学习系列----第一章:基础知识
1.1 常量-----不能改变它的值 1.2 数 在Python 中数可以分为整数.浮点数和复数. PS:在Python中不用区分'long int'类型.默认的整数类型可以任意长.(译者注:长度应该 ...
- iBatis第一章:基础知识概述 & MVC思想
一.java是一门十分受开发人员欢迎的语言,在开发语言排行榜中名列前茅,人们对其看法不尽相同,就我自身感受而言,我觉得java语言的主要优势体现在如下几方面:1.java属于开源语言,开发人员可以找到 ...
- python学习第一天 计算机基础知识
目录 什么是编程语言 什么是编程? 为什么要编程? 计算机5大组成分别有什么作用? qq启动的流程? 建议相关学习 课外 什么是编程语言 什么是编程语言? python和中文.英语一样,都是一门语言, ...
- 《Python基础教程》第一章:基础知识
如果希望只执行普通的除法,可以在程序前加上以下语句:from __future__ import division.还有另外一个方法,如果通过命令行运行Python, 可以使用命令开关-Qnew.此时 ...
随机推荐
- Python基础知识点:多进程的应用讲解
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:东哥IT笔记 现在很多CPU都支持多核,甚至是手机都已经开始支持多核 ...
- 题解 洛谷 P4546 【[THUWC2017]在美妙的数学王国中畅游】
首先发现有连边和删边的操作,所以我们肯定要用\(LCT\)来进行维护. 接下来考虑如何进行\(LCT\)上的信息合并. \(f=1\),则函数为\(f(x)=sin(ax+b)\) \(f=2\),则 ...
- 题解 CF920F 【SUM and REPLACE】
可以事先打表观察每个数的约数个数,观察到如果进行替换,若干次后这个数便会被替换成1. 所以我们可以直接暴力的进行区间修改,若这个数已经到达1或2,则以后就不再修改,用并查集和树状数组进行维护. 这个方 ...
- java实现单链表的增删改以及排序
使用java代码模拟单链表的增删改以及排序功能 代码如下: package com.seizedays.linked_list; public class SingleLinkedListDemo { ...
- jsp课堂笔记2
jsp页面的基本结构 jsp标记 普通html标记 变量和方法的声明 java程序片 java表达式 变量和方法的声明 <%! %> 标记符号之间声明变量和方法 成员变量即全局变 ...
- org.springframework.beans.factory.UnsatisfiedDependencyException异常
注解配置不完整 如Service实现类没有加 * @Service * @Transactional
- win10在html上运行java的applet程序
Applet是采用Java编程语言编写的小应用程序,该程序可以包含在 HTML(标准通用标记语言的一个应用)页中,与在页中包含图像的方式大致相同. 含有Applet的网页的HTML文件代码中部带有 和 ...
- 4.26 省选模拟赛 T3 状压dp 差分求答案
LINK:T3 比较好的题目 考试的时候被毒瘤的T2给搞的心态爆炸 这道题连正解的思路都没有想到. 一看到题求删除点的最少个 可以使得不连通. 瞬间想到最小割 发现对于10分直接跑最小割即可. 不过想 ...
- ASP.NET MVC+LayUI视频上传
前言: 前段时间在使用APS.NET MVC+LayUI做视频上传功能的时,发现当上传一些内存比较大的视频就会提示上传失败,后来通过查阅相关资料发现.NET MVC框架为考虑安全问题,在运行时对请求的 ...
- ubuntu16.04下chrome安装flash插件
最近自己的ubuntu安装了最新的chrome54版本,发现视频无法播放,提示flash版本过期,原来最新的chrome已经不内置flash插件了,需要自己安装. 方法/步骤 1.安装chrome打开 ...