iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 14
0
Software Development

從零開始的Python練成記系列 第 14

[Day 14]用二進位運算法來變魔術

  • 分享至 

  • xImage
  •  

雖然說是變魔術,但其實並沒有特別說特別厲害,其實就是透過位元的平移來讓數值改變,又或是使用and/or/nor來進行數值的變換;之所以說「平移來讓數值改變」,就是讓整個二進位表示的數值再多加幾個位元來讓值變大,又或是反過來減少幾個位元來讓值變小,就先在這裡進行示範吧:

origin = 0b101 #也就是5
set_left = origin << 2 #透過將origin向左平移兩位來使其值變大
set_right = origin >> 1 #相對的,透過將origin向右平移兩位來使其值變小
print(bin(origin))
print(bin(set_left))
print(bin(set_right)) #這三行都是印出二進位表示法的數值
print(int(origin))
print(int(set_left))
print(int(set_right)) #這三行則是將二進位的值轉為int後輸出

而輸出結果會像這樣:

0b101
0b10100
0b10
5
20
2

其實這個「平移」的功能就像是「無條件進位/捨去」,只是從常見的十進位改成是二進位了


接下來就來說明and/or/nor的功能,用比較簡單的文字來說明的話就是兩者皆有/兩者所擁有的/兩者之間的差異,那就來點範例吧:

setter = 0b110010 #32+16+2=50
testing = 0b101010 #32+8+2=42

and_test = setter & testing #使用and運算元
or_test = setter | testing #使用or運算元
nor_test = setter ^ testing #使用nor運算元
print(bin(and_test))
print(bin(or_test))
print(bin(nor_test))

輸出如下:

0b100010 #兩者皆有的位元在5次與1次
0b111010 #兩者擁有的範圍在5,4,3,1次
0b11000 #正確一點的解釋方式,其實是「互斥」

我覺得這好複雜@@


上一篇
[Day 13]不知道這功能肯定是我見識狹隘:二進位運算
下一篇
[Day 15]是時候要來點有挑戰性的:物件導向in Python
系列文
從零開始的Python練成記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言