程序员的数学基础课

参考:程序员的数学基础课

第一章:二进制


1、什么是二进制计数法?

理解二进制之前,先理解十进制。十进制的基数是10,例如:2871 = 210^3 + 810^2 + 710^1 + 1100,可以看到十进制的数位全部都是10n的形式。

明白了十进制,同理二进制的基数就是2,二进制的数位就是2^n的形式,例如110101为二进制,表示为十进制:

image

按照这个思路,我们可以推导出八进制、十六进制等。

基于此,我们来看看二进制、十进制、八进制和十六进制在python中是如何互相转换的,并验证我们之前的推断。

image

2、二进制的位操作

常见的二进制位操作包括向左移位和向右移位操作,以及“或” “与” “异或” 的逻辑操作。下面我们一一来看。

向左移位

二进制 110101 向左移一位,就是在末尾添加一位 0,因此 110101 就变成了 1101010。请注意,这里讨论的是数字没有溢出的情况。

所谓数字溢出,就是二进制数的位数超过了系统所指定的位数,目前主流的系统都支持至少32位的整型数字。如果进行左移操作的二进制已经超出了32位,左移后数字就会溢出,需要将溢出的位数去除。

image

在这个例子中,如果将1101010换算为十进制,int(0b1101010),就是106,正好是53的二倍。 所以,我们可以得出一个结论:二进制左移一位,其实就是将数字翻倍。

向右移位

二进制 110101 向右移一位,就是去除末尾的那一位,因此110101就变成了11010。我们将11010换算为十进制,int(0b11010) 等于 26。正好是53除以2的整数商,所以二进制右移一位,就是将数字除以2的整数商

image

接下来我们看看代码中如何进行移位操作:

image

对10进行左移2位,5进行右移2位,结果:

image

位的“或”

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

总结

  1. 什么是二进制?
    十进制使用 10 作为基数,x 进制使用 x 作为基数, x 进制的数位>就是 x^n 的形式
  2. 计算机为什么使用二进制?
    二进制的数据表达具有抗干扰能力强、可靠性高的优点;二进制非常适>合逻辑运算
  3. 二进制的位操作

    二进制左移一位,就是将数字翻倍。二进制右移一位,就是将数字除以2并求整数商。
    • 或:参与操作的位中,只要有一个是1,最终结果就是1
    • 与:参与操作的位中,必须全都是1,最终结果才是1
    • 异或:参与操作的位相同,最终结果就为0,否则为1

第二章:余数

  1. 余数的特性:整数是没有边界的,它可能是正无穷,也可能是负无穷。余数却总是在一个固定的范围内。生活中,余数可以用来算星期,web编程中可以用在分页中
  2. 同余定理:两个整数 ab,如果它们除以正整数 m 得到的余数相等,我们就可以说 ab 对于模 m 同余
  3. 哈希(Hash):每个编程语言都有对应的哈希函数。哈希有的时候也被翻译为散列,简单来说就是将任意长度的输入,通过哈希算法压缩为某一固定长度的输入

第三章:迭代法

......

你可能感兴趣的:(程序员的数学基础课)