close

因為在leetcode上看到了位元運算的題目,發現自己對於位元運算子的熟悉度非常的低,因此上youtube上找了位元問算的教學視頻,發現有一個滿有趣的教學方法。

 

如果想要紀錄一個學生8個學期辦理停車證的情況,那麼我們可以用一個長度為8的整數陣列去紀錄該學生的辦理狀況,但因為使用整數陣列非常的浪費記憶體空間,所以使用一個字元去紀錄,那麼就可以達到節省記憶體空間的目標。

 

學期8

學期7

學期6

學期5

學期4

學期3

學期2

學期1

 

 

 

 

 

0

0

1

1

0

0

0

1

 

利用一個位元,就可以紀錄一個學生的8個學期的辦理狀況。接下來要說明如何利用位元運算子的操作改變學生的辦理情形。

 

 

[&] ___ 察看第n學期,則用數字2n-1次方取and,例如8為第四學期

 

49

0

0

1

1

0

0

0

1

8

0

0

0

0

1

0

0

0

49&8

0

0

0

0

0

0

0

0

 

因為49&8 = 0,所以可以得知再第四學期的時候,該學生並沒有辦理停車證。

若想察看第五學期,則49%16=0,所以該學生在第五學期有辦理車證。

 

 

[ | ] ___ 替第n學期加入辦理車證之紀錄,例如8為第四學期

 

49

0

0

1

1

0

0

0

1

8

0

0

0

0

1

0

0

0

49 | 8

0

0

1

1

1

0

0

1

 

 

[ ~ ] ___ 替第n學期取消辦理車證之紀錄,例如8為第四學期

 

49 | 8

0

0

1

1

1

0

0

1

~8

1

1

1

1

0

1

1

1

49|8 & ~8

0

0

1

1

0

0

0

1

 

原本學生在第4學期(49|8)的紀錄為true,但可以發現做了&~的動作後,該生在第8學期的紀錄為false

 

 

[ ^ ] ___ 互斥或,相同是false,相異是true。因此也可以使用XOR達到替第n學期取消辦理車證之紀錄,例如8為第四學期

 

49 | 8

0

0

1

1

1

0

0

1

255^8

1

1

1

1

0

1

1

1

49|8 & 255^8

0

0

1

1

0

0

0

1

 

 

補充,ab兩數互換 :a^=b^=a^=b Ex: a=9,b=14

a

0

0

0

0

1

0

0

1

b

0

0

0

0

1

1

1

0

a=a^b

0

0

0

0

0

1

1

1

b=a^b

0

0

0

0

1

0

0

1

a=a^b

0

0

0

0

1

1

1

0

 

 

 

[ >> vs << ] ___ 移位,主要用在可以快速的找到2n次方

 

例如:

想要快速的找到第6個學期,我們叫不可能直接算出25次方是多少,因此可以直接使用 1 << 5,就可以讓我們更直接的對程式命令指向第5個學期而不用如前述的例子中直接輸入數字8( 0000 0100 )

 

a = 0001 1011

a << 1 往左移1個位元,則a = 0011 0110。最右邊補0

a >> 1 往右移1個位元,則a = 0000 1101。最左邊補0

 

上述只是邏輯概念,如果實際應用於程式內應為如下,

a=5

a=0101

a=5

a<<=2

a=10100

a=20

a>>=2

a=0001

a=1

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 魚大 的頭像
    魚大

    魚大-程式筆記

    魚大 發表在 痞客邦 留言(0) 人氣()