取余 和 与

1. 与(&)的真面目

ABA&B
000
010
100
111

可以看出,在二进制的位运算中:

  1. 不管是 0 还是 1 ,& 1 的结果都是 本身
  2. 不管是 0 还是 1 ,& 0 的结果都是 0

1   &   x = x x ∈ ( 0 , 1 ) ⇒ p e r s i s t 0   &   x = 0 x ∈ ( 0 , 1 ) ⇒ r e s e t \begin{aligned} &1\ \&\ x=x\quad x\in(0,1)\Rightarrow persist\\ &0\ \&\ x=0\quad x\in(0,1)\Rightarrow reset \end{aligned} ​1 & x=xx∈(0,1)⇒persist0 & x=0x∈(0,1)⇒reset​

2. << 左移

假设,有 4 4 4 位二进制数 x 4 x 3 x 2 x 1 x_4x_3x_2x_1 x4​x3​x2​x1​ ,乘以 2 3 2^3 23

x 4 x 3 x 2 x 1 × 2 3 =   ( x 4 ⋅ 2 3 + x 3 ⋅ 2 2 + x 2 ⋅ 2 1 + x 1 ⋅ 2 0 ) × 2 3 =   x 4 ⋅ 2 6 + x 3 ⋅ 2 5 + x 2 ⋅ 2 4 + x 1 ⋅ 2 3 =   x 4 x 3 x 2 x 1 000 \begin{aligned} &x_4x_3x_2x_1\times2^3\\ =&\ (x_4\cdot2^3 + x_3\cdot2^2 + x_2\cdot2^1 + x_1\cdot2^0)\times2^3\\ =&\ x_4\cdot2^6 + x_3\cdot2^5 + x_2\cdot2^4 + x_1\cdot2^3\\ =&\ x_4x_3x_2x_1000 \end{aligned} ===​x4​x3​x2​x1​×23 (x4​⋅23+x3​⋅22+x2​⋅21+x1​⋅20)×23 x4​⋅26+x3​⋅25+x2​⋅24+x1​⋅23 x4​x3​x2​x1​000​
可以看出,任何一个二进制数,乘以 2 N 2^N 2N ,就是将原来的数字,左移 N N N 位,后面补 0 0 0 。

3. >> 右移

假设,有 4 4 4 位二进制数 x 4 x 3 x 2 x 1 x_4x_3x_2x_1 x4​x3​x2​x1​ ,除以 2 2 2^2 22

x 4 x 3 x 2 x 1 ÷ 2 2 =   ( x 4 ⋅ 2 3 + x 3 ⋅ 2 2 + x 2 ⋅ 2 1 + x 1 ⋅ 2 0 ) ÷ 2 2 =   x 4 ⋅ 2 1 + x 3 ⋅ 2 0 + x 2 ⋅ 2 − 1 + x 1 ⋅ 2 − 2 =   x 4 x 3   ⋯   x 2 x 1 \begin{aligned} &x_4x_3x_2x_1\div2^2\\ =&\ (x_4\cdot2^3 + x_3\cdot2^2 + x_2\cdot2^1 + x_1\cdot2^0)\div2^2\\ =&\ x_4\cdot2^1+x_3\cdot2^0+x_2\cdot2^{-1}+x_1\cdot2^{-2}\\ =&\ x_4x_3\ \cdots\ x_2x_1 \end{aligned} ===​x4​x3​x2​x1​÷22 (x4​⋅23+x3​⋅22+x2​⋅21+x1​⋅20)÷22 x4​⋅21+x3​⋅20+x2​⋅2−1+x1​⋅2−2 x4​x3​ ⋯ x2​x1​​

可以看出,任何一个二进制数,除以 2 N 2^N 2N ,就是将原来的数字,右移 N N N 位。移出去的,是 余数

x 4 x 3 x 2 x 1   %   2 2 = x 2 x 1 x_4x_3x_2x_1\ \%\ 2^2 = x_2x_1 x4​x3​x2​x1​ % 22=x2​x1​

4. % 取余

既然,当除数是 2 N 2^N 2N ,余数是挪出去的那 N N N 位,对于取余运算来说,提取出最后的 N N N 位就可以了。怎么做呢?清零 & 保留

假设,有 4 4 4 位二进制数 x 4 x 3 x 2 x 1 x_4x_3x_2x_1 x4​x3​x2​x1​ ,取余 2 2 2^2 22

x 4 x 3 x 2 x 1   %   2 2 =   x 4 x 3 x 2 x 1   &   ( 2 2 − 1 ) =   x 4 x 3 x 2 x 1   &   0011 =   x 2 x 1 \begin{aligned} &x_4x_3x_2x_1\ \%\ 2^2\\ =&\ x_4x_3x_2x_1\ \&\ (2^2-1)\\ =&\ x_4x_3x_2x_1\ \&\ 0011\\ =&\ x_2x_1 \end{aligned} ===​x4​x3​x2​x1​ % 22 x4​x3​x2​x1​ & (22−1) x4​x3​x2​x1​ & 0011 x2​x1​​

可以看出,任何一个二进制数,取余 2 N 2^N 2N ,就可以 & ( 2 N − 1 ) (2^N-1) (2N−1) 。得到需要右移的 N N N 位。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐