参考:程序员的数学基础课
第一章:二进制
1、什么是二进制计数法?
理解二进制之前,先理解十进制。十进制的基数是10,例如:2871 = 210^3 + 810^2 + 710^1 + 1100,可以看到十进制的数位全部都是10n的形式。
明白了十进制,同理二进制的基数就是2,二进制的数位就是2^n的形式,例如110101为二进制,表示为十进制:
按照这个思路,我们可以推导出八进制、十六进制等。
基于此,我们来看看二进制、十进制、八进制和十六进制在python中是如何互相转换的,并验证我们之前的推断。
2、二进制的位操作
常见的二进制位操作包括向左移位和向右移位操作,以及“或” “与” “异或” 的逻辑操作。下面我们一一来看。
向左移位
二进制 110101 向左移一位,就是在末尾添加一位 0,因此 110101 就变成了 1101010。请注意,这里讨论的是数字没有溢出的情况。
所谓数字溢出,就是二进制数的位数超过了系统所指定的位数,目前主流的系统都支持至少32位的整型数字。如果进行左移操作的二进制已经超出了32位,左移后数字就会溢出,需要将溢出的位数去除。
在这个例子中,如果将1101010换算为十进制,int(0b1101010),就是106,正好是53的二倍。 所以,我们可以得出一个结论:二进制左移一位,其实就是将数字翻倍。
向右移位
二进制 110101 向右移一位,就是去除末尾的那一位,因此110101就变成了11010。我们将11010换算为十进制,int(0b11010) 等于 26。正好是53除以2的整数商,所以二进制右移一位,就是将数字除以2的整数商。
接下来我们看看代码中如何进行移位操作:
对10进行左移2位,5进行右移2位,结果:
位的“或”
num1 = 0b110101
num2 = 0b100011
print(bin(num1 | num2))
// output: 0b110111
位的“与”
num1 = 0b110101
num2 = 0b100011
print(bin(num1 & num2))
// output: 0b100001
位的“异或”
num1 = 0b110101
num2 = 0b100011
print(bin(num1 ^ num2))
// output: 0b10110
总结
- 什么是二进制?
十进制使用 10 作为基数,x 进制使用 x 作为基数, x 进制的数位>就是 x^n 的形式- 计算机为什么使用二进制?
二进制的数据表达具有抗干扰能力强、可靠性高的优点;二进制非常适>合逻辑运算- 二进制的位操作
二进制左移一位,就是将数字翻倍。二进制右移一位,就是将数字除以2并求整数商。
- 或:参与操作的位中,只要有一个是1,最终结果就是1
- 与:参与操作的位中,必须全都是1,最终结果才是1
- 异或:参与操作的位相同,最终结果就为0,否则为1
第二章:余数
- 余数的特性:整数是没有边界的,它可能是正无穷,也可能是负无穷。余数却总是在一个固定的范围内。生活中,余数可以用来算星期,web编程中可以用在分页中
- 同余定理:两个整数 a 和 b,如果它们除以正整数 m 得到的余数相等,我们就可以说 a 和 b 对于模 m 同余
- 哈希(Hash):每个编程语言都有对应的哈希函数。哈希有的时候也被翻译为散列,简单来说就是将任意长度的输入,通过哈希算法压缩为某一固定长度的输入
第三章:迭代法
......