【★】假如人类使用16进制

  十进制一直是我心中过不去的一道坎。。

人类社会使用十进制已经几十万年的历史了,追根到底它源于远古智人的手指计数:当十只手指记不下时就会找其他记号标记一个“十”,接着从1开始再次用手指记录,以此循环。当十根可爱的手指头在眼前不停晃动,重复最末位的计数,人们也慢慢习惯上了这种进位方式,代代相传。

可不幸的是,现代计算机和二进制密不可分。无论是内存地址,硬盘数据,总线信号还是无线电磁波,都遵循着二进制排列组合的规则。因为种种原因,两级对立的普遍性和稳定性存在于这个物质世界的许多地方:晶体管的开与关(内存),电磁的正与负(机械硬盘),电信号的有与无(数据线),波频的高与低(无线网络)。

十进制与二进制相距甚远,且不是次方关系,这直接造成了许多问题,首当其冲的就是:符号匮乏的二进制想要表示一个文件需要排列组合很长很长一串,最重要的是十进制二进制之间的转换比较麻烦。

随着大脑进化,人类早就脱离了用手指来记10以下的数量,直接大脑缓存即可,事实上人脑可以轻松驾驭远大于10的进制计算。只是基因和社会化的缘故,导致我们仍然依赖于十进制。

这些窘境该如何解决呢?在这里有一个“不成熟”的方案蓝图:不改变计算机而去改变人类自己,让人类使用16进制!

正如之前所说,两极性的普遍实用让二进制和十进制“相爱相杀”,因为两极之间的稳定性和快速切换性无处不在,就像语言学中“正反大小高低强弱”这些普遍支持的衡量概念。计算机历史上曾经有人想挑战这一“盛世哲学”但均无功而返:第一代美国军用计算机利用高能耗的电子管cpu试图实现十进制计算来与人类同步;俄罗斯曾经提出的三进制创想最终化为泡沫。对计算机进制的争议最终还是收敛到无可比拟的二进制。

为什么人类使用16进制会更好呢?这里有两点原因,第一点原因是为了适应计算机。

先来说下计算器核心部件的工作逻辑:

当你从输入设备上依次写入十进制数的每一位之后(注意此时内存中是一个用二进制表示每一位的十进制数),cpu通过算法将它们转化成一个完整的二进制数(通常分配一个4字节的空间用于存储)。之后就开始了二进制数之间的数值运算,也就是经典的逻辑运算实现加减法,加减组成乘除,算出结果后再通过一个二转十进制的算法输出。

逻辑电路

在这个过程中,十与二进制之间的转换计算所消耗的时间要远大于单纯的两个数之间的四则运算,这就是存在的“不合理”之处。

为解决这个矛盾,聪明的程序猿们提出了模拟竖式计算的“十进制算法”,这种办法直接绕过了数制转换。在内存或缓存中,数是直接以十进制的形式存放的,最终通过每一位十进制数字之间的二进制计算,同时模仿十进制的进位规则,最终得到的结果自然也是十进制的。这种算法还突破了4Byte存储的限制,让计算更灵活。

But,仿竖式计算的致命缺陷仍然在存储上,因为至少要用一个字节来存储位数字,可惜一个字节可以表示256个不同数字,运用在十进制上面显然很浪费,即使只用4个比特也也会损失一半以上的资源浪费。可想而知,这种算法只适用于“连续计算但不连续输出”的情况,存储时还得转成二进制,再加上浮点数的负数的限制让这种算法难以大规模使用。

大整数竖式乘法的核心算法

说来说去,矛盾的核心还是停留在进制的转换问题上。这时请调用我们灵活的大脑,发挥想象,顺便回到主题“16进制”。众所周知2进制转16进制是相当简便与直接的:一个16进制数字与4位二进制数一一对应,即实现了空间充分利用又大大降低了转换的成本,直接加快了OSI参考模型中“应用层”的执行速度,简直是完美。如果人类从一开始就使用十六进制生活工作,到20世纪伊始又邂逅了可爱的图灵计算机,那么此时的我们将多么受益啊!

还有,人类最好使用16进制的第二点原因是:有助于人类自己。十进制对于我们的大脑的计算和记忆能力来说过于简单容易了,16进制更丰富的表示能力可以让人们的生活潜移默化地趋向多样化,渗透到我们的语言和文化的种种方面,激发大脑的智力,提升大脑的思考。虽然听起来很抽象,却是个不争的事实,只可惜人类进化史让我们没能长处8根指头,不然这个世界会是个全新的面貌哦。

所以请容许我提出一个目前看似无法实现的梦想,就是“全民改用16进制”。此愿望若是成真,将是多么大的一个进步啊。可见社会固化并不全是好处,正确的变革还是由少数人完成的哈,也许未来会有越来越多人意识到这一条可持续发展的新方向。

 

时间: 2024-10-25 10:36:10

【★】假如人类使用16进制的相关文章

!假如人类使用 16 进制

  非常不好意思,因为因为这篇文章是用pdf写的,在转成html格式的途中遇到很多图片上的bug,遂选择了全部导出jpg再发布,如果有更好解决方案,请不吝留言哈.为了凑满150字,以下都是些没用的:表酱紫啊表酱紫啊表酱紫啊表酱紫啊表酱紫啊表酱紫啊表酱紫啊表酱紫啊表酱紫啊表酱紫啊表酱紫啊表酱紫啊表酱紫啊表酱紫啊表酱紫啊表酱紫啊.

Web开发:关于16进制颜色代码你又知道多少

开发:关于16进制颜色代码你又知道多少-"> 这有必要了解一颜色系统的概念: RGB:RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一.RGB色彩模式使用 RGB模型为图像中每一个像素的RGB分量分配一个0~255范围内的强度值.RGB图像只使用三种颜色,就可以使它们按照不同的比例混合,在

javascript-js 如何将16进制数据转浮点数

问题描述 js 如何将16进制数据转浮点数 js 如何将16进制数据转浮点数 我想 把str ='AB23FF12E1' 这个转成浮点数 解决方案 http://blog.csdn.net/yin138/article/details/13504441 解决方案二: 补充一句,123.456(float) = '79 E9 F6 42'; 如何把 '79 E9 F6 42'; 还原回 123.456呢? 解决方案三: 补充一句,123.456(float) = '79 E9 F6 42'; 如何

http-HTTP 通信 参数 16进制传递

问题描述 HTTP 通信 参数 16进制传递 HTTP通信中,发现有个参数是采用16进制传递的 传递参数如下: p1=1658997962& p2=000151A57CD6005827A00F88E49BBF297AD9D19C51D7D116FF8E81FB4 C6397377D27BDDFEF87AE50E27AA9364CD44EE4F2D87CE9147EEA291F452 A679D16C70A442C8C01584BD4A87C880D76CEA25309CF0B1E5D12EC5B

android中String转换成16进制的方法

问题描述 android中String转换成16进制的方法 想请教一下?把一个24个字节的字符串转换成16进制,并把结果打印出来要怎么写,网上有一些方法但是没有说转换完的16进制串打印出来要用哪个参数?求指点 解决方案 byte[] b = ""字符串"".getBytes();foreach (byte i : b){if (i < 16) System.out.print(""0"" + Integer.toHexS

mfc-用MFC的编辑框怎么显示16进制

问题描述 用MFC的编辑框怎么显示16进制 从串口收的数据,想直接用16进制显示,怎么做?在MFC的编辑框里显示- 解决方案 // TODO: 在此处添加消息处理程序代码 //从串口接收数据并显示在编辑框中 VARIANT variant_inp; COleSafeArray safearray_inp; long len k; byte rxdata[512]; //设置BYTE数组 CString strtemp; unsigned short CRC16 = 0; short temp[4

PHP的16进制互转

<?php   /**   *   * ASCII 转 十六进制 以及 十六进制 转 ASCII   * 非盈利组织或个人请放心转载,商业用途请征得作者同意   *   */  //ASCII 转 十六进制   function asc2hex($str) {   return '\x'.substr(chunk_split(bin2hex($str), 2, '\x'),0,-2);   }   //十六进制 转 ASCII   function hex2asc($str) {   $str 

[HOWTO]ORACLE中如何实现ASC字符串和16进制串互相转换

oracle|转换|字符串 ORACLE中如何实现ASC字符串和16进制串互相转换 欢迎大家同我交流:enhydraboy   enhydra_boy@tom.com 欢迎转载,请保留本声明,谢谢! 下面是笔者以前回答csdn论坛上问题的总结,希望对大家有用. ASC字符串==>16进制串 create or replace function AscToHex(sIn IN varchar2)RETURN varchar2ISsTmp varchar2(4000);i integer;BEGIN

c#中int 转string 16进制和16转double的方法

0x开头的16进制没有负数和小数 #region change hex to double private Double HexConverToDouble(string hexString) { if (hexString == "") { return 0; } string data; if (hexString.StartsWith("0x")) { data = hexString.Substring(2); } else { data = hexStri