欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

程序员们节日快乐!你真的懂啥是1024吗?

程序员文章站 2022-04-13 11:41:16
...

你真的懂啥是1024吗?

今天就是一年一度的1024节了!

package com.ocnyang.app;
/**
 * 程序员们,1024快乐。
 */
public class Hello1024 {
    public static final String PROGRAM_APES = "程序猿";
    public static final String PROGRAM_GIRLS = "程序媛"; //这个真不知道怎么翻译了
    public static final String DATE_1024 = "10月24日";

    public static void main(String args[]) {
        java.util.Calendar c = java.util.Calendar.getInstance();
        java.text.SimpleDateFormat f = new java.text.SimpleDateFormat("yyyy年MM月dd日hh时mm分ss秒");
        is1024(f.format(c.getTime()));
    }

    private static void is1024(String date) {
        if ((!android.text.TextUtils.isEmpty(date)) && date.contains(DATE_1024))
            System.out.println(PROGRAM_APES + "和" + PROGRAM_GIRLS + ",Happy 1024!");
    }
}

好吧并没有这个节,不过这个日子该庆祝啥,相信在座诸位很多人都懂的:

当然是庆祝二进制了!

1024是一个整数嘛。它等于 210,二进制表示为10000000000。

本来1024这种东西应该是数学家的玩具,但是不幸我们有了电脑,而电脑是基于二进制运行的,所以这个奇怪的数字就变得人尽皆知了……

一个来自巧合的单位

因为电脑的运行和存储都基于二进制,所以内存也好磁盘也好闪存也好,理论总容量应该是2的某次幂。老一些的内存都是64M、128M、256M、512M这样的数字,更老一些的电脑开机自检会在屏幕上读出内存容量,往往还要读3遍,经常能看到16384kB、65536kB这样的数字——这些也都是2的次幂。

程序员们节日快乐!你真的懂啥是1024吗?
1024

可能今天多数人对2的次幂主要的熟悉来源,是2048这个游戏。虽然2048是明确复刻了1024,而1024则是抄袭了"Three!"的创意,但这种事情这里就不要提了吧。图片来源:imgur.com

但最常用的2次幂,当然还是1024——它是计算机领域的基本倍数:1M = 1024k,1G = 1024M,等等。

问题来了!1024和1000太接近了——一个有趣而有用的巧合,正因此它成了计算机的基本倍数;但另一些时候就烦人了。

210 ≈ 103,这个巧合在估算的时候很管用。比如想知道262是多少,就把它拆成260 × 22,前者约等于1018,后者等于4,因此就是4×1018。(实际上大约是4.61×1018,相差不大。)

但这只是数量级上相差不大,1024毕竟不等于1000。如果你买了一个4600T的硬盘,结果到手只有4000T,你可能就不开心了。

到底是1000还是1024?

其实现在硬盘几乎都在玩这个花招。计算机内部计算都是按照1024来算的,但是销售时却都会按照1000来宣称。比如我现在这个标称为500G的硬盘,实际上总可用空间是接近500000000000字节,对于计算机来说,只有465G。

程序员们节日快乐!你真的懂啥是1024吗?
1000or1024

然而你又不太好说他们错——k啊M啊这些前缀,都是从科学计数法的前缀里拿来的,人家本来就是指1000,只是在电脑里成了1024。这些前缀都来自希腊语:

  • kilo是1795年法国人设立公制的时候从希腊语改来的词,本来是1000,但计算机里1kB = 1024B;
  • Mega来自希腊文“大”,1947年在科学计数法里确立为1000k,在计算机里就是1024k;
  • Giga来自希腊文“非常大”,在科学计数法是1000M,计算机是1024M;
  • Tera来自希腊文“怪物”,在科学计数法是1000G,计算机是1024G;
  • Peta来自希腊文“五”,因为正常的大词用完了,于是改用“第五个1000”这种意思。在科学计数法是1000T,计算机是1024T。其实本来五应该写作penta,但是因为上一个词——Tera正好比“四”Tetra少一个字母,所以Peta也是故意去掉了中间的字母来保证不会和原词相混;
  • Exa来自希腊文“六”,和hexa同根,但这次希腊文自己就没有保留那个“h”,所以沿用了;
  • Zetta是本系列里唯一的异类。正常的希腊文“七”前缀应该是hepta,但没有使用,反而用了希腊数字体系里的Ζʹ(读作zeta);
  • Yotta则回归本源,来自希腊文“八”。

一般用户几乎不会接触到P以上的级别。在T这一级上,二者的差距不到10%,大家通常也就忍了。

为了避免混淆,国际电工委员会(IEC)提出过一个标准:IEC 80000-13。在这个标准下,科学计数法(1000)按照正常标记,而计算机领域(1024)则全都加一个小写i。因此,1kB就是1000B,而1KiB才是1024B;1 MiB = 1024 KiB,1 GiB = 1024 MiB,等等。不幸的是,这个标准没有得到很广泛的使用,现在大家还是都是乱来的。

最先用1024的可能是……埃及人?

大家平常喜欢说是中国人发明了二进制。这么说倒也不是不可以,二进制正式进入数学体系要归功于莱布尼兹,而莱布尼兹很喜欢中国,明确认为《易》所用的八卦和六十四卦就是一种二进制。但是古代中国人并没有使用这些二进制数进行计算。单纯说构想出二进制表达数字的办法,那很多文明都干过;然而古埃及人有一种乘法,真的是在用相当于二进制的方式来运算了。

比如,计算1262 × 13,他们会这样计算:

1262 × 13 
= (1024 + 128 + 64 + 32 + 8 + 4 + 2) × 13
= 1024 ×  13 + 128 × 13 + 64 × 13 + 32 × 13 + 8 × 13 + 4 × 13 + 2 × 13
= 13312 + 1664 + 832 + 416 + 104 + 52 + 26
= 16406

等等,这是在干啥?

如果我们来做乘法的话,那么我们会:

1262 × 13 
= 1000 × 13 + 200 × 13 + 60 × 13 + 2 × 13

……好像也差不多。

对,古埃及人也是把大数拆成小数来算乘法,但是我们拆成10、100、1000的倍数,而他们则拆成2、4、8、16、32、64……的倍数。这是二进制呀!

虽然不那么直观,但是二进制也有它的好处:便于不动脑查表格。按照我们十进制乘法,每一位都有10种可能:千位可能没有,也可能是1000、2000、3000、4000……9000。这样表格上就得留出9个位置。但是二进制乘法下,每一位要么有,要么没有。虽然要拆的次数变成了三倍(还记得为什么是三倍吗),但拆完之后就省事儿了。

这种计算方式并没有对后代产生很大影响,但每次我们敲出1024的时候,除了达盖尔的旗帜之外,似乎还是值得缅怀一下古埃及人?
摘录