numpy学习笔记4——常用函数3

import numpy as np

函数的方法

a = np.arange(9)
#addd的方法
print('add方法')
#reduce==sum 总和,返回一个数
print('reduce')
print(np.add.reduce(a))
print(a.sum())

#accumulate==cumsum 累计和,返回一数组
print('accumulate')
print(np.add.accumulate(a))
print(a.cumsum())

#outer 返回一个数组,这个数组的秩是输入两个的数组的秩的和
print('outer')
b = np.arange(3)
c = np.add.outer(a,b)
print(c)
#验证一下
print(np.linalg.matrix_rank(a))
print(np.linalg.matrix_rank(b))
print(np.linalg.matrix_rank(c))

#reduceat 
print('reduceat')
print(np.add.reduceat(a, [0, 5, 2, 7]))
print(np.add.reduce(a[0:5]))
print(a[5])
print(np.add.reduce(a[2:7]))
print(np.add.reduce(a[7:]))
add方法
reduce
36
36
accumulate
[ 0  1  3  6 10 15 21 28 36]
[ 0  1  3  6 10 15 21 28 36]
outer
[[ 0  1  2]
 [ 1  2  3]
 [ 2  3  4]
 [ 3  4  5]
 [ 4  5  6]
 [ 5  6  7]
 [ 6  7  8]
 [ 7  8  9]
 [ 8  9 10]]
1
1
2
reduceat
[10  5 20 15]
10
5
20
15

reducead的输入参数为两个,一个是要计算的数组,一个是索引
计算方法是:

结果的第一个元素是0到5的索引的和

结果的第二个元素是5的索引(因为5>2)

结果的第三个元素是2到7的索引的和

结果的第四个元素是7到end的索引的和

算术运算

#四则运算
d = np.array([1,5,4,3])
e = np.array([6,7,9,7])
print('加法')
print(np.add(d,e))

print('减法')
print(np.subtract(d,e))

print('乘法')
print(np.multiply(d,e))

print('除法')
print('divide')
print(np.divide(d,e)) #只保留整数==/ 
print(np.divide(e,d))
print('/') #与/的运算结果一致
print(d/e)
print(e/d)

print('true_divide')
print(np.true_divide(d,e)) #保留小数
print(np.true_divide(e,d))

print('floor_divide')
print(np.floor_divide(d,e)) #除完后向下取整==//
print(np.floor_divide(e,d))
print('//') #与//的运算结果一致
print(d//e)
print(e//d)
加法
[ 7 12 13 10]
减法
[-5 -2 -5 -4]
乘法
[ 6 35 36 21]
除法
divide
[0.16666667 0.71428571 0.44444444 0.42857143]
[6.         1.4        2.25       2.33333333]
/
[0.16666667 0.71428571 0.44444444 0.42857143]
[6.         1.4        2.25       2.33333333]
true_divide
[0.16666667 0.71428571 0.44444444 0.42857143]
[6.         1.4        2.25       2.33333333]
floor_divide
[0 0 0 0]
[6 1 2 2]
//
[0 0 0 0]
[6 1 2 2]

在python3.7.4中np.divide和’/'并不只保留整数,还保留小数

# 模运算
f = np.arange(-4,4)
#remainder==mod==%
print('remainder')
print(np.remainder(f,2)) #对2取模


print('mod')
print(np.mod(f,2))

print('%')
print(f % 2)

print('fmod') #取模 结果的正负号由被除数决定
print(f) #除数
print(np.fmod(f,2))
remainder
[0 1 0 1 0 1 0 1]
mod
[0 1 0 1 0 1 0 1]
%
[0 1 0 1 0 1 0 1]
fmod
[-4 -3 -2 -1  0  1  2  3]
[ 0 -1  0 -1  0  1  0  1]

斐波那契数列

又称黄金分割数列,数列的特点是以递归的方式定义,其中元素之间满足关系: F ( 1 ) = 1 , F ( 2 ) = 1 , F ( 3 ) = F ( 2 ) + F ( 1 ) = 2 , . . . , F ( n ) = F ( n − 1 ) + F ( n − 2 ) ( n > = 3 , n ∈ N ∗ ) F(1)=1,F(2)=1,F(3)=F(2)+F(1)=2,...,F(n)=F(n-1)+F(n-2) (n>=3,n\in{N^*}) F(1)=1,F(2)=1,F(3)=F(2)+F(1)=2,...,F(n)=F(n1)+F(n2)(n>=3,nN)

#利用矩阵相乘创建
#基础矩阵
g = np.matrix([[1, 1], [1,0]])
print(g)

print('基矩阵自身相乘')
h = g*g
print(h)
print('斐波那契数列第一个数')
print(h[0,0])
print('基矩阵自身相乘六次')
i = g**7
print(i)
print('斐波那契数列第八个数')
print(i[0,0])
[[1 1]
 [1 0]]
基矩阵自身相乘
[[2 1]
 [1 1]]
斐波那契数列第一个数
2
基矩阵自身相乘六次
[[21 13]
 [13  8]]
斐波那契数列第八个数
21

矩阵相乘得到斐波那契数列的原理:


( 1 1 1 0 ) ∗ ( 1 1 1 0 ) = ( 1 ∗ 1 + 1 ∗ 1 1 1 1 ) = ( 2 1 1 1 ) \begin{pmatrix}1&1\\1&0\\\end{pmatrix} * \begin{pmatrix}1&1\\1&0\\\end{pmatrix} = \begin{pmatrix}{1*1+1*1}&1\\1&1\\\end{pmatrix} = \begin{pmatrix}2&1\\1&1\\\end{pmatrix} (1110)(1110)=(11+11111)=(2111)


基矩阵子相乘一次(g * g)第一个元素为F(3)=2


( 2 1 1 1 ) ∗ ( 1 1 1 0 ) = ( 1 ∗ 2 + 1 ∗ 1 1 2 0 ) = ( 3 2 2 1 ) \begin{pmatrix}2&1\\1&1\\\end{pmatrix} * \begin{pmatrix}1&1\\1&0\\\end{pmatrix} = \begin{pmatrix}{1*2+1*1}&1\\2&0\\\end{pmatrix} = \begin{pmatrix}3&2\\2&1\\\end{pmatrix} (2111)(1110)=(12+11210)=(3221)


基矩阵子相乘两次(g * g * g=g** 3)第一个元素为F(4)=F(3)+F(2)=2+1=3



基矩阵子相乘n次(g * g * g …=g** (n+1))第一个元素为F(n+2)=F(n)+F(n-1)

#利用黄金分割公式创建
j = np.arange(1,9) #计算前八个斐波那契数列
print(j)

k = np.sqrt(5) #根号5
a = (1+k)/2
b = (1-k)/2
m = (a**j - b**j)/k  #见下面的公式(12)

print(m)
print('结果')
n = np.rint(m) #取整(类型不变)
print(n)
[1 2 3 4 5 6 7 8]
[ 1.  1.  2.  3.  5.  8. 13. 21.]
结果
[ 1.  1.  2.  3.  5.  8. 13. 21.]

黄金分割公式如下:其中a为总长,b为段长


b 2 = a ∗ ( a − b ) = a 2 − a ∗ b b^2 = a*(a-b)=a^2-a*b b2=a(ab)=a2ab


解得


b a = 5 − 1 2 ≈ 0.618 \frac{b}{a}=\frac{\sqrt{5}-1}{2}\approx0.618 ab=25 10.618


斐波那契数列和黄金分割的关系是:从三个元素开始,相邻两个元素的商接近黄金分割比例,数值越大越接近


2 3 ≈ 0.6667 \frac{2}{3}\approx0.6667 320.6667


3 5 = 0.6 \frac{3}{5}=0.6 53=0.6





13 21 ≈ 0.619 \frac{13}{21}\approx0.619 21130.619





lim ⁡ n → + ∞ a n a n − 1 = 5 − 1 2 ≈ 0.618 \lim_{n\to+\infty} \frac{a_n}{a_{n-1}}=\frac{\sqrt{5}-1}{2}\approx0.618 n+liman1an=25 10.618

斐波那契数列的通项推导

下面根据矩阵创建方式推导斐波那契数列的通项F(n):


根据矩阵相乘得到的规律,由基矩阵相乘n-2次(n-1次方)得到矩阵:

( 1 1 1 0 ) n = ( F ( n ) x 1 x 1 x 2 ) (1) {\begin{pmatrix}1&1\\1&0\\\end{pmatrix}}^{n} = \begin{pmatrix}F(n)&x1\\x1&x2\\\end{pmatrix}\tag{1} (1110)n=(F(n)x1x1x2)(1)

由基矩阵相乘n-1次(n次方)得到矩阵如下公式,再代入(1)式化简如下:


( 1 1 1 0 ) n = ( F ( n + 1 ) y 1 y 1 y 2 ) = ( F ( n ) x 1 x 1 x 2 ) ∗ ( 1 1 1 0 ) = ( F ( n ) + x 1 F ( n ) x 1 + x 2 x 1 ) (2) {\begin{pmatrix}1&1\\1&0\\\end{pmatrix}}^{n} = \begin{pmatrix}F(n+1)&y1\\y1&y2\\\end{pmatrix} = \begin{pmatrix}F(n)&x1\\x1&x2\\\end{pmatrix}*\begin{pmatrix}1&1\\1&0\\\end{pmatrix} = \begin{pmatrix}F(n)+x1&F(n)\\x1+x2&x1\\\end{pmatrix}\tag{2} (1110)n=(F(n+1)y1y1y2)=(F(n)x1x1x2)(1110)=(F(n)+x1x1+x2F(n)x1)(2)

左右两边对应相等可以得到:


{ F ( n + 1 ) = F ( n ) + x 1 y 1 = F ( n ) y 1 = x 1 + x 2 y 2 = x 1 (3) \begin{cases}F(n+1)=F(n)+x1\\y1=F(n)\\y1=x1+x2\\y2=x1\end{cases}\tag{3} F(n+1)=F(n)+x1y1=F(n)y1=x1+x2y2=x1(3)

由斐波那契数列的特点可以得到:


{ F ( n + 1 ) = F ( n ) + F ( n − 1 ) F ( n ) = F ( n − 1 ) + F ( n − 2 ) (4) \begin{cases}F(n+1)=F(n)+F(n-1)\\ F(n)=F(n-1)+F(n-2)\end{cases}\tag{4} {F(n+1)=F(n)+F(n1)F(n)=F(n1)+F(n2)(4)


将(4)式代入(3)式可以得到
{ x 1 = F ( n − 1 ) y 1 = F ( n ) x 2 = F ( n − 2 ) y 2 = F ( n − 1 ) (5) \begin{cases}x1=F(n-1)\\y1=F(n)\\x2=F(n-2)\\y2=F(n-1)\end{cases}\tag{5} x1=F(n1)y1=F(n)x2=F(n2)y2=F(n1)(5)


代入(2)式可得

( 1 1 1 0 ) n = ( F ( n + 1 ) F ( n ) F ( n ) F ( n − 1 ) ) (6) {\begin{pmatrix}1&1\\1&0\\\end{pmatrix}}^{n} = \begin{pmatrix}F(n+1)&F(n)\\F(n)&F(n-1)\\\end{pmatrix}\tag{6} (1110)n=(F(n+1)F(n)F(n)F(n1))(6)

所以接下来的问题就是求解:
( 1 1 1 0 ) n (7) {\begin{pmatrix}1&1\\1&0\\\end{pmatrix}^n}\tag{7} (1110)n(7)

先求 A = ( 1 1 1 0 ) A={\begin{pmatrix}1&1\\1&0\\\end{pmatrix}} A=(1110)的特征值,下面是A的特征方程:

∣ λ E − A ∣ = ∣ λ − 1 − 1 − 1 λ ∣ = λ 2 − λ − 1 = 0 (8) |\lambda E-A| = \begin{vmatrix}\lambda-1&-1\\-1&\lambda\\\end{vmatrix}=\lambda^2-\lambda-1=0\tag{8} λEA=λ111λ=λ2λ1=0(8)

可以解得特征值为 λ 1 = 1 + 5 2 \lambda_1 = \frac{1+\sqrt{5}}{2} λ1=21+5 λ 2 = 1 − 5 2 \lambda_2 = \frac{1-\sqrt{5}}{2} λ2=215
由于二阶矩阵具有两个不同的特征值,所以矩阵A可对角化。


λ = 1 + 5 2 \lambda= \frac{1+\sqrt{5}}{2} λ=21+5 代入 ( λ E − A ) x = 0 (\lambda E-A)x=0 (λEA)x=0得到 ( − 1 + 5 2 − 1 − 1 1 + 5 2 ) x = 0 \begin{pmatrix}\frac{-1+\sqrt{5}}{2}&-1\\-1&\frac{1+\sqrt{5}}{2}\\\end{pmatrix}x=0 (21+5 1121+5 )x=0从而得到特征向量 α 1 = ( 1 − 1 + 5 2 ) \alpha_1 = \begin{pmatrix}1\\\frac{-1+\sqrt{5}}{2}\\\end{pmatrix} α1=(121+5 )

λ = 1 − 5 2 \lambda= \frac{1-\sqrt{5}}{2} λ=215 代入 ( λ E − A ) x = 0 (\lambda E-A)x=0 (λEA)x=0得到 ( − 1 + 5 2 − 1 − 1 1 − 5 2 ) x = 0 \begin{pmatrix}-\frac{1+\sqrt{5}}{2}&-1\\-1&\frac{1-\sqrt{5}}{2}\\\end{pmatrix}x=0 (21+5 11215 )x=0从而得到特征向量 α 2 = ( 1 − 1 + 5 2 ) \alpha_2 = \begin{pmatrix}1\\-\frac{1+\sqrt{5}}{2}\\\end{pmatrix} α2=(121+5 )

构造可逆矩阵 P = ( α 1 , α 2 ) = ( 1 1 − 1 + 5 2 − 1 + 5 2 ) P=(\alpha_1,\alpha_2)=\begin{pmatrix}1&1\\\frac{-1+\sqrt{5}}{2}&-\frac{1+\sqrt{5}}{2}\\\end{pmatrix} P=(α1,α2)=(121+5 121+5 )使得 A = P Λ P − 1 A=P \Lambda P^{-1} A=PΛP1


所以 A n = P Λ n P − 1 (9) A^n =P \Lambda^n P^{-1}\tag{9} An=PΛnP1(9)
根据二阶方阵的求逆公式 ( a b c d ) − 1 = 1 a c − b d ( d − b − c a ) {\begin{pmatrix}a&b\\c&d\\\end{pmatrix}}^{-1}=\frac{1}{ac-bd}\begin{pmatrix}d&-b\\-c&a\\\end{pmatrix} (acbd)1=acbd1(dcba)得到:


P − 1 = − 1 5 ( − 1 + 5 2 − 1 − − 1 + 5 2 1 ) = 1 5 ( 1 + 5 2 1 − 1 + 5 2 − 1 ) (10) P^{-1}=\frac{-1}{\sqrt{5}}\begin{pmatrix}-\frac{1+\sqrt{5}}{2}&-1\\-\frac{-1+\sqrt{5}}{2}&1\\\end{pmatrix} = \frac{1}{\sqrt{5}}\begin{pmatrix}\frac{1+\sqrt{5}}{2}&1\\\frac{-1+\sqrt{5}}{2}&-1\\\end{pmatrix}\tag{10} P1=5 1(21+5 21+5 11)=5 1(21+5 21+5 11)(10)

将式(10)代入(9)可得:
A n = ( 1 1 − 1 + 5 2 − 1 + 5 2 ) ( ( 1 + 5 2 ) n 0 0 ( 1 − 5 2 ) n ) 1 5 ( 1 + 5 2 1 − 1 + 5 2 − 1 ) = ( ( 1 + 5 2 ) n ( 1 − 5 2 ) n − 1 + 5 2 ( 1 + 5 2 ) n − 1 + 5 2 ( 1 − 5 2 ) n ) 1 5 ( 1 + 5 2 1 − 1 + 5 2 − 1 ) = 1 5 ( ( 1 + 5 2 ) n ( 1 − 5 2 ) n ( 1 + 5 2 ) n − 1 ( 1 − 5 2 ) n − 1 ) ( 1 + 5 2 1 − 1 + 5 2 − 1 ) = 1 5 ( ( ( 1 + 5 2 ) n + 1 − ( 1 − 5 2 ) n + 1 ) ( ( 1 + 5 2 ) n − ( 1 − 5 2 ) n ) ( 1 + 5 2 ) n − ( 1 − 5 2 ) n ( 1 + 5 2 ) n − 1 − ( 1 − 5 2 ) n − 1 ) (11) A^n=\begin{pmatrix}1&1\\\frac{-1+\sqrt{5}}{2}&-\frac{1+\sqrt{5}}{2}\\\end{pmatrix} \begin{pmatrix}(\frac{1+\sqrt{5}}{2})^n&0\\0&(\frac{1-\sqrt{5}}{2})^n\\\end{pmatrix} \frac{1}{\sqrt{5}}\begin{pmatrix}\frac{1+\sqrt{5}}{2}&1\\\frac{-1+\sqrt{5}}{2}&-1\\\end{pmatrix}\\= \begin{pmatrix}(\frac{1+\sqrt{5}}{2})^n&(\frac{1-\sqrt{5}}{2})^n\\\frac{-1+\sqrt{5}}{2}(\frac{1+\sqrt{5}}{2})^n &-\frac{1+\sqrt{5}}{2}(\frac{1-\sqrt{5}}{2})^n\\\end{pmatrix} \frac{1}{\sqrt{5}}\begin{pmatrix}\frac{1+\sqrt{5}}{2}&1\\\frac{-1+\sqrt{5}}{2}&-1\\\end{pmatrix}\\= \frac{1}{\sqrt{5}}\begin{pmatrix}(\frac{1+\sqrt{5}}{2})^n&(\frac{1-\sqrt{5}}{2})^n\\(\frac{1+\sqrt{5}}{2})^{n-1} &(\frac{1-\sqrt{5}}{2})^{n-1}\\\end{pmatrix} \begin{pmatrix}\frac{1+\sqrt{5}}{2}&1\\\frac{-1+\sqrt{5}}{2}&-1\\\end{pmatrix}\\= \frac{1}{\sqrt{5}}\begin{pmatrix}((\frac{1+\sqrt{5}}{2})^{n+1}-(\frac{1-\sqrt{5}}{2})^{n+1})&((\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n)\\(\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n &(\frac{1+\sqrt{5}}{2})^{n-1}-(\frac{1-\sqrt{5}}{2})^{n-1}\\\end{pmatrix}\tag{11} An=(121+5 121+5 )((21+5 )n00(215 )n)5 1(21+5 21+5 11)=((21+5 )n21+5 (21+5 )n(215 )n21+5 (215 )n)5 1(21+5 21+5 11)=5 1((21+5 )n(21+5 )n1(215 )n(215 )n1)(21+5 21+5 11)=5 1(((21+5 )n+1(215 )n+1)(21+5 )n(215 )n((21+5 )n(215 )n)(21+5 )n1(215 )n1)(11)

将式(11)和式(6)对比,左右两变对应相等,可以得到F(n)的表达式:

F ( n ) = 1 5 ( 1 + 5 2 ) n − ( 1 − 5 2 ) n ) (12) F(n) = \frac{1}{\sqrt{5}} (\frac{1+\sqrt{5}}{2})^n-(\frac{1-\sqrt{5}}{2})^n)\tag{12} F(n)=5 1(21+5 )n(215 )n)(12)

波形绘制

方波

方波的傅里叶级数为 ∑ k = 1 + ∞ 4 s i n ( ( 2 k − 1 ) t ) ( 2 k − 1 ) π \sum_{k=1}^{+\infty}\frac{4sin((2k-1)t)}{(2k-1)\pi} k=1+(2k1)π4sin((2k1)t)

import matplotlib.pyplot as plt
%matplotlib inline  
#根据傅里叶级数画图
t = np.linspace(-np.pi,np.pi,201)
k = np.arange(1,100) #序列
f = np.zeros_like(t) #初始化数组
#计算每一个点
for i in range(len(t)):
    f[i] = np.sum((4*np.sin((2*k-1)*t[i]))/((2*k-1)*np.pi))
plt.plot(t,f)

在这里插入图片描述

锯齿波与三角波

锯齿波的傅里叶级数为 ∑ k = 1 + ∞ − 2 s i n ( 2 k t π ) k π \sum_{k=1}^{+\infty}\frac{-2sin(2kt\pi)}{k\pi} k=1+kπ2sin(2ktπ)

而三角波的取值是锯齿波的绝对值

#根据傅里叶级数画图
t = np.linspace(-np.pi,np.pi,201)
k = np.arange(1,100) #序列
f = np.zeros_like(t) #初始化数组
#计算每一个点
for i in range(len(t)):
    f[i] = np.sum((-2*np.sin(2*k*t[i]*np.pi))/(k*np.pi))
plt.subplot(121)
plt.plot(t,f)
plt.title('Sawtooth Wave')
plt.subplot(122)
plt.plot(t,np.abs(f))
plt.title('Triangular Wave')

在这里插入图片描述

利萨如曲线

利萨如曲线是两个沿着相互的垂直方向的正弦震荡合成的曲线,利用利萨如曲线可以欸测量出两个信号的频率差或相位差。

t = np.linspace(-np.pi,np.pi,201) #模拟时间点,从-Π到Π中产生201个均匀分布的点
a = 8 #x方向的震幅
b = 9 #y方向的震幅
x = np.sin(a*t + np.pi/2) #相位为二分之一Π
y  = np.sin(b*t) #相位为0
plt.plot(x,y)
plt.show()

在这里插入图片描述

位操纵

#不等运算符(^)---符号不一致时返回负数
x = np.arange(-9,9)
y = -x
print(x^y)
print((x^y)<0)

#函数实现
z = np.bitwise_xor(x,y) #对应^
print(z)
print(np.less(z,0)) #对应<0
[ -2 -16  -2  -4  -2  -8  -2  -4  -2   0  -2  -4  -2  -8  -2  -4  -2 -16]
[ True  True  True  True  True  True  True  True  True False  True  True
  True  True  True  True  True  True]
[ -2 -16  -2  -4  -2  -8  -2  -4  -2   0  -2  -4  -2  -8  -2  -4  -2 -16]
[ True  True  True  True  True  True  True  True  True False  True  True
  True  True  True  True  True  True]

^ 其实是异或运算,要想得具体数值,需要把原来的十进制数值转为二进制补码进行计算,因为计算机是以补码的形式计算,而在显示过程又重新把其还原为十进制表示。下面是几种码的概念。

原码:最高位为符号位,1表示负数,0表示正数,其他为二进制数。9的原码是00001001,-9的原码是10001001

反码:正数的反码等于原码,负数的反码等于除符号位外,按位取反。9的反码是00001001,-9的反码是11110110

补码:正数的补码等于原码,而对于负数的补码,其计算规则符合:负数的补码等于反码+1。9的补码是00001001,-9的补码是11110111

以’-9 ^ 9’为例,9的二进制为1001。-9的补码是11110111,9的补码是00001001,^表示异或运算:两个相同的数异或后输出0,两个不同的数异或后输出1。

11110111

00001001


11111110

也就是-9 ^ 9的最后结果的是11111110,但是这是补码的形式,所以还需要把补码先转为原码。补码转原码的规律依然是:符号位不变,其余取反加1。所以11111110补码的原码是10000001+1=10000010(二进制加法)。然后再将原码转为十进制就是的-2,所以-9 ^ 9=-2,其余的计算方法也是一样。

#位与操作符(&)
x = np.arange(-9,9)
y = x & (x-1)
print(y)
print(y==0)

#函数实现
z = np.bitwise_and(x,(x-1)) #对应&
print(z)
print(np.equal(z,0))#对应===
[-10 -16  -8  -8  -6  -8  -4  -4  -2   0   0   0   2   0   4   4   6   0]
[False False False False False False False False False  True  True  True
 False  True False False False  True]
[-10 -16  -8  -8  -6  -8  -4  -4  -2   0   0   0   2   0   4   4   6   0]
[False False False False False False False False False  True  True  True
 False  True False False False  True]

位于的运算和^的运算类似,这里以-9 & -10<br>

-9的补码是11110111<br>
-10:原码:10001010,反码:11110101:补码:11110110<br>
为例。位与操作是只有当两个数都为1时才输出1,其余输出0。所以有<br>

11110111

11110110


11110110

11110110对应的原码为10001010,对应的十进制为-10

#移位操作符
print(1<<2)
x = np.arange(-9,9)
y = x & ((1<<2)-1)
print(x)
print(y)

#函数实现
z = np.left_shift(1,2) #对应1<<2
print(z)
print(np.bitwise_and(x, z-1)) #对应&
4
[-9 -8 -7 -6 -5 -4 -3 -2 -1  0  1  2  3  4  5  6  7  8]
[3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0]
4
[3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0]

1的二进制为0001,左移两位后变成0100,十进制为4。而将2的幂次减去1会变成一个全1的二进制数,如4的二进制为0100,减1变为11。对全1的二进制进行与(&)操作可以得到以2为幂数作为模的余数,也就是说与11进行&操作,就会得到以4为模的余数。同理。对111进行&操作,就会得到以8为模的余数。对于-9对4取余,余数一般取正数,所以,-9÷4 = -3…3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值