因為在leetcode上看到了位元運算的題目,發現自己對於位元運算子的熟悉度非常的低,因此上youtube上找了位元問算的教學視頻,發現有一個滿有趣的教學方法。
如果想要紀錄一個學生8個學期辦理停車證的情況,那麼我們可以用一個長度為8的整數陣列去紀錄該學生的辦理狀況,但因為使用整數陣列非常的浪費記憶體空間,所以使用一個字元去紀錄,那麼就可以達到節省記憶體空間的目標。
學期8 |
學期7 |
學期6 |
學期5 |
學期4 |
學期3 |
學期2 |
學期1 |
|
|
有 |
有 |
|
|
|
有 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
利用一個位元,就可以紀錄一個學生的8個學期的辦理狀況。接下來要說明如何利用位元運算子的操作改變學生的辦理情形。
[&] ___ 察看第n學期,則用數字2的n-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 |
補充,a、b兩數互換 :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 << ] ___ 移位,主要用在可以快速的找到2的n次方
例如:
想要快速的找到第6個學期,我們叫不可能直接算出2的5次方是多少,因此可以直接使用 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
留言列表