1. 程式人生 > 其它 >python中的整數除操作符、減操作符、乘操作符_從“位運算”炫技到“操作符”,再到逐步理解“群論”...

python中的整數除操作符、減操作符、乘操作符_從“位運算”炫技到“操作符”,再到逐步理解“群論”...

技術標籤:python中的整數除操作符、減操作符、乘操作符

位運算操作符,再到逐步理解群論

Step by Step for Understanding from Bitwise to Operators, then Group Theory

是否曾經會有過很努力,還是看不懂別人程式碼的苦惱?

有時是演算法思路堵塞,有時是作者“故意”用了一些奇形怪狀的位運算來炫技!

比如交換兩個變數,不借助第三者的異或運算^;判斷奇偶數用 &運算;置位用左移<>運算等等。

這些程式碼常見於嵌入式程式設計(考慮效率),或程式設計比醜大賽(Hacker)之中。

為什麼一般看不懂呢?

因為通常我們腦中並沒有很好理解它的意義,而習慣上加、減、乘、除("+-*/")的意義好像都已印入腦中!

但仔細一想,這些"&,|,^,<>,~,"與“加減乘除”其實都一樣,沒什麼區別的,它們都是操作符(Operator) 啊!

操作符繫結兩個數,再安一些規則在其中,就形成了!

聽不懂?,那麼倒要真的問一下自己,是否真的懂了加減乘除啦?(據說博士畢業之前最好都要搞懂)

下面將舉一些具體的位操作運算例子,以輔助大家對各操作符意義的理解。

然後結合加減乘除上升到操作符的抽象!

最後再到群論的入門介紹

希望大家領略了群論的風景之後,再回來看自己曾經學過的各個計算機語言(C,C++,C#,Java,Python,Javascript...雖然很多我都不熟?),會有too simple, too young的感慨?~

位操作介紹

位操作主要有與、或、非和異或,下面將介紹各種位操作的基本用法。

0 & 1 = 0

1 & 0 = 0

0 & 0 = 0

1 & 1 = 1

0 | 1 = 1

1 | 0 = 1

0 | 0 = 0

1 | 1 = 1

!0 = 1

!1 = 0

異或

1 ^ 0 = 1

0 ^ 1 = 1

0 ^ 0 = 0

1 ^ 1 = 0

位操作符兩邊的數a和b只有兩個數0和1,加減乘除兩邊的運算元a和b可以是所有實數(除法b不能為0),這是它們的最大區別,再無其它!

要把運算對映到人可以理解的意義,第一步要把二進位制數映到實數(整數),再結合效果map到人習慣理解的意義!

1.判斷一個數的奇偶性(不用%2操作)

n=3
#ifniseven,willbetrue,elsefalse
deff(n):
returnn&1==0

f(n)
False
f(4)
True

2.判斷一個數是否為2的整數冪

deff(n):
returnn&(n-1)==0

f(4)
True

3.不用臨時變數交換兩個數

defswap(a,b):
a^=b
b^=a
a^=b
returna,b

x,y=3,4
swap(x,y)
(4, 3)

4.找到陣列中出現奇數次的元素:

一個非空陣列,只有一個元素出現奇數次,其餘出現偶數次,找出那個元素:

arr=[1,2,1,2,4,3,3]
res=0
foriinarr:
res^=i

res
#任何一個數字異或它自己都等於0。也就是說,如果我們從頭到尾依次異或陣列中的每一個數字,
#那麼最終的結果剛好是那個只出現奇數次的數字,因為那些出現偶數次的數字全部在異或中抵消掉了。
4

5.求兩個整數的平均值(結果有小數點時拋棄小數點)

deff(a,b):
return(a+b)>>1

f(5,6)
5

6.取兩個數的最大值(某些機器上,效率比a>b ? a:b高)

deff(a,b):
returnb&((a-b)>>31)|a&(~(a-b)>>31)

f(8,22)
22

7.取兩個數的最小值(某些機器上,效率比a>b ? b:a高)

deff(a,b):
returna&((a-b)>>31)|b&(~(a-b)>>31)

f(3,4)
3

8.判斷兩個數符號是否相同(0算正號)

deff(x,y):
return(x^y)>=0

f(3,4)
True

9.計算2的n次方

deff(n):
return2<-1)

f(3)
8

10.從低位到高位,取某數的第m位

deff(n,m):
return(n>>(m-1))&1

f(8,4)
1

11.從低位到高位,將某數的第m位置1

deff(n,m):
returnn|(1<-1))

f(8,2)
10

12.取相反數 (注意~是目運算子)

deff(n):
return~n+1

f(-5)
5

13.判斷兩個數是否相等

deff(x1,x2):
return(x1^x2)==0

f(3,4)
False

14.對n加1,++

deff(n):
return-~n

f(3)
4

15.對n減1,--

deff(n):
return~-n

f(4)
3

16.取絕對值

deff(n):
return(n^(n>>31))-(n>>31)

f(-9)
9

我們總結一下:

  • 任何數和 0 進行 OR 都為自身:x | 0 = x。

  • 任何數和 -1 進行 OR 都為 -1:x | -1 = -1。

  • 任何數和 0 進行 XOR 都為自身:x ^ 0 = x。

  • 任何數和 -1 進行 XOR 都為 ~x:x ^ -1 = ~x。

  • 任何數和其自身進行 XOR 都為0:x ^ x = 0。

  • 對任何數 x 進行 NOT 操作的結果為 -(x + 1),~x = -(x+1)。

  • <

在位數沒溢位的情況下,左移一位,可視為乘2操作,左移n位相當於乘以2的n次方

  • >>(有符號右移)該運算元會將第一個運算元向右移動指定的位數。向右被移出的位被丟棄,左側用0補充,最左側符號位用原符號位填充。

在位數沒溢位的情況下,右移一位,可視為除2操作,右移n位相當於除以2的n次方

所有符號都只是一個代表某種意義的操作符,而已!它和“加減乘除”是完全一樣的!

進而我們是不是可以把這種操作符進一步抽象?把它和集合中的元素繫結在一起就形成了群論!

群(group)的基本定義:

群是一個集合G 加上一個操作符運算"#",它結合任何兩個元素a和b而形成另一個元素,記為a#b。

要成為群,這個集合和操作運算(G,#)必須滿足叫做群公理(group axioms)的四個要求:

  • (1)封閉性(closure):對於所有G中a,b,運算a#b的結果也在G中。
  • (2)結合性(Associativity):對於所有G中的a,b和c,等式 (a#b)#c=a#(b#c)成立。
  • (3)單位元(Identity element):G中存在一個元素e,對於所有G中的元素a,等式 e#a = a#e = a 成立。
  • (4)逆元(Inverse element):對於每個G中的a,存在G中的一個元素b使得 a#b=b#a=e。

注意:

  • (1)"#"可以是帶有任何有意義的操作符,有一些不一定滿足交換律,即a#b!=b#a,比如矩陣運算。
  • (2)單位元和逆元是唯一的。
  • (3)然後群還有 阿貝爾群,迴圈群,半群,么半群,子群,群同態,群同構,陪集,商群等概念,數學家總結的一些定理精彩致極!
  • (4)你可能會感受到到5次方程的根無解問題原來如此簡單
  • (5)你可能會看費馬小定理變得如此顯然,不就是1+1=2一樣自然的嗎?

希望各位鑑賞完後,再來看前面的位運算操作炫技,是否是雕蟲小技??......


數學之水,更多免費乾貨、敬請關注詳查~~

deabe2576c50271f273e8eecfe99200d.png

dc36c59bcd616863f89c26442deb85d7.png