“二进制”数字与我日常编程有何关系?
我正在努力深入理解编程的整体概念。我知道“二进制”的教科书定义,但我不明白它到底是如何应用到我日常编程中的。
关于“二进制数字”和普通数字的概念,我尽管努力去研究和理解,但还是完全搞不懂。
我最开始是自学编程,通过在早期的DOS Basic和C语言中制作一些简单的冒险游戏,现在大部分(其实是全部)工作都是用PHP、JavaScript、Rails和其他“网页”语言来做。我发现这些高级语言中很多逻辑都被抽象掉了,这让我感觉自己缺少了很多继续进步和写出更好代码所需的工具。
如果有人能推荐一些好的、实用的学习资源,或者在这里解释一下,我会非常感激。
我并不是在寻找“定义”(我已经看过维基百科的页面好几次了),而是想知道如何将我新学到的关于二进制数字的知识应用到日常编程中,是否有用。我现在主要使用PHP,所以如果能具体提到这个语言,那就更好了。
编辑:正如所指出的,二进制是一种数字的表示方式,而不是完全不同的系统。所以我想修正一下我的问题,使用二进制表示数字有什么好处(如果有的话),而不是直接使用普通数字。
8 个回答
这里有两种使用二进制(和普通数字)的方法。
因为提到了普通这个词,所以可能不是:
- 二进制以紧凑的字节形式存储,比如一个整数占4个字节,一个双精度浮点数占8个字节。这在SQL中对应
INT
或DOUBLE
。而普通数字则以文本形式存储,每个数字占一个字节。在SQL中对应VARCHAR
。
但在我们的例子中:
- 不同进制的表示:101的二进制 = 1*4 + 0*2 + 1*1 = 5。
这适合用来复杂编码是/否的状态:
给定1 | x = 1
和0 | x = x
(或者说是二进制的加法),还有0 & x = 0
和1 & x = x
(也就是二进制的乘法)
$sex_male = 0:
$sex_female = 1;
$employee_no = 0*2;
$employee_yes = 1*2;
$has_no_email = 0*4;
$has_email = 1*4;
$code = $sex_female | $employee_no | $has_email;
if (($code & $sex_female) != 0) print "female";
这里有个简短的背景介绍,帮助你理解,最后我会回答你的问题。
二进制有点奇怪,因为我们习惯用十进制。这个习惯是因为人类有十根手指,当数到十的时候就得用棍子、脚趾或者其他东西来表示十根手指。不过并不是所有文化都是这样,有些狩猎采集的群体(比如澳大利亚土著)使用的是五进制(用一只手),因为他们不需要处理很大的数字。
总之,二进制在计算机中很重要,因为电路可以有两种状态:低电压和高电压;可以把它想象成一个开关(开和关)。把8个这样的开关放在一起就形成了1字节(8位)。位的最佳理解方式是1代表开,0代表关,这正是二进制的表示方式。你可能会看到像10011100这样的数字,其中1表示高电压,0表示低电压。在早期的计算机中,使用的是物理开关,操作员可以手动开关来创建程序。
现在,在现代编程中,你很少需要用到二进制数字。唯一的例外可能是位运算,这是一种非常快速和高效的解决某些问题的方法,或者可能涉及一些计算机黑客技术。我建议你了解一下基本概念,但不用担心在日常编程中实际使用它。
二叉树(你提到的标签之一),特别是二叉搜索树,在一些日常编程场景中非常实用,比如排序。
二进制数字是计算机基础知识的重要部分,但在高级编程语言中使用得比较少。
二进制数字有助于理解一些界限,比如不同宽度下最大的无符号数字(例如,32位的最大值是2^32 - 1),或者是二的补码(通常使用的系统)下的最大和最小有符号数字。例如,为什么32位的最小有符号二的补码是-2^31,而最大值是2^31 - 1?乍一看更奇怪的是,-(-2^31)(对最小值取反)竟然又得到了它自己。(提示,可以用2位数字试试,因为分析是一样的)。
另一个例子是基本的信息理论。我需要多少位来表示10000种可能性(log2 10000,向上取整)?这也适用于加密技术,但你可能还没有深入到那部分。
虽然你不需要每天都使用二进制,但还是要对这些概念有个基本的了解,原因有很多。
如果你去看看pack和位运算符,可能会发现其他用途。特别是,很多程序员不知道什么时候可以使用异或(XOR),这可以通过查看涉及两个二进制数字的真值表来理解。