我记得当年刚开始学编程那会儿,对这二进制的东西,那叫一个头疼。总觉得是那些搞底层硬件、操作系统的大神们才需要碰的玩意儿,我们这些写应用软件的,根本没必要去操那个心。不就是些0和1嘛看着都晕。
结果?吃大亏了。那会儿公司有个老项目,跑在一些嵌入式设备上,数据传输那叫一个奇葩,各种配置文件都是直接用十六进制表示,一长串一长串的,我看一眼就犯困。每次排查bug,尤其是那些跟数据格式、底层通信沾边的,我都是两眼一抹黑,纯粹靠瞎猜,改完后祈祷它能跑起来。搞得项目组长看我这样,直接把我叫过去,劈头盖脸一顿骂。
第一次挨骂,脑袋瓜子嗡嗡的
他当时就指着屏幕上那堆十六进制代码,问我这是啥意思,那个位是干啥的。我吭哧半天,一个字都答不出来。他气得直拍桌子,说我连最基本的计算机原理、数据表示法都不懂,怎么写好程序?还说我这就是“纸上谈兵”,只会用高级语言写写业务逻辑,一到核心问题就抓瞎。当时脸都绿了,羞愧得想找个地缝钻进去。但转念一想,他说得确实是实话,心里的那个窝火劲儿,一下就变成了非要搞懂的决心。
于是我开始了我的“恶补”之路。那时候真是下了死力气。
-
小编温馨提醒:本站只提供游戏介绍,下载游戏请前往89游戏主站,89游戏提供真人恋爱/绅士游戏/3A单机游戏大全,点我立即前往》》》绅士游戏下载专区
翻书阶段:我先是把大学时候那些厚厚的《计算机组成原理》、《数据结构》又翻了出来。结果?那些书理论一大堆,公式一套套的,什么位运算、移位、补码反码,还没看两页,我的眼皮就开始打架,脑子就自动关机了。光看这些抽象的文字,根本理解不了它到底在干嘛
-
视频阶段:我又去网上找各种教学视频,什么“十分钟搞懂二进制”、“大神带你玩转位运算”。结果?大部分视频都是上来就讲概念,讲各种复杂的应用场景,跳过了最基础、最本质的东西,或者用一堆专业术语,听得我云里雾里,还是感觉隔着一层纱。
我的“土办法”和豁然开朗的瞬间
试了各种办法,发现效果都不咋地。后来我一琢磨,这玩意儿不就是最底层的东西吗?那它肯定是最简单的逻辑构成。复杂是因为我们把它想复杂了。我就想,计算机不就是靠电信号工作的嘛有电没电,高电平低电平,这不就是“开”和“关”吗?用1代表“开”,用0代表“关”,不就齐活了?
我当时就找了张白纸,一支笔,开始我自己动手画画、算算。
我从最基础的“位”(bit)开始。一个位,就是一个开关,它只有两种状态:0或者1。这简单!
那两个位?我画了两个灯泡,它们可以有四种状态:00(都灭)、01(右边亮)、10(左边亮)、11(都亮)。四个!三个位就是八种状态。,原来每个位都能翻倍,是2的N次方。这下概念清楚了。
然后我就开始琢磨,我们平时用的十进制数字,它是怎么变成计算机认识的这些“开关”信号的?
我用的是“除二取余法”。比如一个十进制的数字13,我想知道它二进制是
- 13除以2,商是6,余数是1。
- 6除以2,商是3,余数是0。
- 3除以2,商是1,余数是1。
- 1除以2,商是0,余数是1。
然后我把这些余数从下往上倒着写出来,就是1101。一下就通了!我拿了一堆十进制数字自己算,从1算到100,算得我手都酸了,但心里亮堂多了,感觉这东西再也不是什么玄学了。
反过来,把二进制转成十进制,我也找到了方法。它就是“位权法”。
比如二进制数1101,从右边第一个位开始,每个位都有个2的多少次方作为“权重”。
- 最右边的1,是2的0次方,也就是1。所以是1乘以1。
- 它左边那位是0,是2的1次方,也就是2。所以是0乘以2。
- 再左边那位是1,是2的2次方,也就是4。所以是1乘以4。
- 最左边那位是1,是2的3次方,也就是8。所以是1乘以8。
把这些乘出来的结果全部加起来:(1 8) + (1 4) + (0 2) + (1 1) = 8 + 4 + 0 + 1 = 13。这不就对上了嘛那一刻,我真有一种“原来如此”的惊喜感,感觉自己打通了任督二脉。
搞懂了单个数字的转换,我就开始看“字节”(byte)是一个位(bit)就是一个开关,那八个开关绑在一起,就是一个字节(byte)。这八个开关从00000000到11111111,能表示的数字范围是0到255。,原来电脑里所有东西,文字、图片、视频,都是这么一串串的开关信号。像我们平时键盘上打个字母“A”,在电脑里就是一串0和1的组合,比如ASCII码就是01000001。真是太神奇了,一下子把那些抽象的东西具象化了。
后来又接触了十六进制和八进制,理解起来就轻松多了。它们本质上就是二进制的“缩写”,为了让人看着方便。四个二进制位可以用一个十六进制表示,三个二进制位可以用一个八进制表示。所以当初那些配置文件里的大长串十六进制数,我一下就能拆开,还原成二进制,再组合起来看它代表什么,不再是天书,而是有规律可循的“密码本”了。
彻底通透,编程感觉都不一样了
从那以后,我再看那些底层数据、网络协议、内存地址,甚至那些加密的东西,就没那么怵了。我知道它们本质上都是0和1的排列组合。以前写程序碰到数据类型转换,搞不清边界,现在心里有谱了。感觉就像一下子看穿了计算机的“内心”一样,编程的逻辑也清晰了很多,写出来的代码也更扎实了。
那次被组长骂,现在想起来还挺感谢他的。要不是那一下,我可能还在稀里糊涂地写代码。这二进制,真的没那么玄乎,就是一套简单的规矩。只要你愿意花时间去掰扯清楚,自己多动手算算画画,你也能搞明白,而且一旦搞明白,你会发现世界都变得不一样了。那些曾经让你困惑的,一下子就豁然开朗了。别怕,干就完了!

