本文介绍了一种由作者开发的延迟消息队列框架,旨在解决高并发场景下的需求。该框架不仅简单、稳定且具备良好的扩展性,能够提供精准的定时任务和延迟队列处理功能。自开源以来,它已成功为多家中小企业提供了有效的定时调度方案,经过了实际生产环境的考验。为了让更多人受益,现提供开源框架的地址。
写在前面
应许多小伙伴的要求,我开设了一个新的专题【程序员进阶系列】。在该专题中,我将分享计算机和软件的底层知识,帮助大家更好地理解计算机的架构,提升编程能力和软件设计能力。这篇文章将作为专题的开篇,希望能为大家带来实质性的帮助。
数据的表示
在计算机中,所有数据均以二进制形式表示,使用0和1来表示所有信息。而我们日常生活中使用的数字是十进制的,因此在计算机中表示这些数字时需要进行进制转换。
进制转换
R进制转10进制
将R进制数转换为10进制可通过按权展开的方法进行。具体操作为:将R进制数的每一位数值用R^k^表示,其中底数为R,k为该位数字与小数点之间的距离。左侧的数字k从小数点向左数为0, 1, 2等,右侧的数字则从-1开始,依次类推。
例如,二进制数11010101.01转换为10进制为:1 x 2^7^ + 1 x 2^6^ + 0 x 2^5^ + 1 x 2^4^ + 0 x 2^3^ + 1 x 2^2^ + 0 x 2^1^ + 1 x 2^0^ + 0 x 2^-1^ + 1 x 2^-2^。
注:2^7^表示2的7次方。

再举例,一个八进制数76128.01转换为10进制为:7 x 8^4^ + 6 x 8^3^ + 1 x 8^2^ + 2 x 8^1^ + 8 x 8^0^ + 0 x 8^-1^ + 1 x 8^-2^。

十进制转R进制
将十进制转换为R进制相对简单,可以使用短除法。
例如,十进制数字69转换为二进制的过程如下。

得到短除法的结果后,将余数逆序排列即为十进制69转换为二进制的结果,得到:1000101。
二进制与八进制互转
二进制转八进制时,每三位二进制数表示一个八进制数。八进制中有8个基数(0~7),每逢8进1。二进制0的表示为000,7的表示为111,因此每三位二进制数对应一位八进制数。反之,每一位八进制数对应三位二进制数。
具体划分策略是从二进制的低位开始,每三位二进制数对应一个八进制数,不足三位前面补0。例如,二进制数10001110转化为八进制的过程如下。

所以,二进制数10001110转为八进制的结果为216。
同样,八进制转二进制与二进制转八进制相反,每位八进制数对应三位二进制数。
二进制与十六进制互转
十六进制数字包括15个基数(0~15),每逢16进1。将二进制数转化为十六进制时,需明确每位十六进制数需要四位二进制数表示。十六进制中,最大基数15的二进制为1111,最小基数0的二进制为0000,因此每位十六进制数需四位二进制数表示。
从二进制的低位开始,每四位二进制数对应一位十六进制数。
例如,将二进制数10001110转换为十六进制数如下。

注意:在十六进制中,A, B, C, D, E, F分别代表10, 11, 12, 13, 14, 15。
因此,二进制10001110转为十六进制的结果为8E。
十六进制转二进制与二进制转十六进制的过程相反,将十六进制的每一位转为四位二进制数即可。
数据的码制
在计算机中,带符号的数字可用原码、反码、补码和移码表示,这些方法称为码制。
原码
在原码表示中,最高位是符号位,0表示正数,1表示负数,剩余的n-1位表示数值的绝对值,数值0的原码有两种形式:

反码
在反码中,最高位为符号位,0表示正数,1表示负数。正数的反码与原码相同,负数的反码是其绝对值按位取反。数值0的反码同样有两种表示形式:


补码
在补码中,最高位为符号位,0表示正数,1表示负数。正数的补码与原码和反码相同,负数的补码等于其反码加1。在补码表示中,0的补码是唯一的:


移码
移码表示法是通过在数X上增加一个偏移量来定义的,常用于表示浮点数中的阶码。如果机器字长为n,规定偏移量为2^n-1^。
实际上,在偏移2^n-1^的情况下,只需将补码的符号位取反便可获得相应的移码。
码制总结
下面是一个表格,通过八位的二进制数表示相应的数值。
码制 数值1 数值-1 1-1 原码 0000 0001 1000 0001 1000 0010 反码 0000 0001 1111 1110 1111 1111 补码 0000 0001 1111 1111 0000 0000 移码 1000 0001 0111 1111 1000 0000
通过表格可以发现:
正数的原码、反码和补码是相同的;负数的反码是原码除符号位外的其他位取反;负数的补码是其反码加1。移码是在补码的基础上符号位取反得到。
在负数的原码和补码转换中,我们可以得出以下结论:
负数的原码转补码需在原码基础上除符号位外的其他位取反,然后末位加1;负数的补码转原码则是在补码基础上除符号位外的其他位取反,然后末位加1。
也就是说,负数的原码转补码和补码转原码的规则是相同的。小伙伴们可以根据表格自行验证。
计算机使用补码进行加减法运算
再来看表格最后一列1-1,在计算机中表示为1+(-1),其正确结果应为0。接下来分析使用原码、反码、补码和移码进行加减法运算的结果。
在表格第一行中,使用原码计算的结果为1000 0010,转换为10进制为-2,1-1不等于-2,因此,原码加减法运算结果是错误的。在反码中,计算1-1的结果为1111 1111,显然不为0,所以反码加减法运算结果也是错误的。而在补码中,计算1-1的结果为0000 0000,结果为0,因此补码加减法运算结果是正确的。在移码中,计算1-1的结果为1000 0000,结果为-0,虽然-0也等于0,但严格来说结果不正确。
在计算机中,不会使用移码进行加减法运算,移码用于浮点数的阶码。
