iT邦幫忙

DAY 4
7

Javascript系列 第 4

javascript中的位元運算子 (3)

  • 分享至 

  • twitterImage
  •  

討論邏輯運算子(logical operators)與位元運算子(bitwise operators)的使用情境

Part I. logical operators
Part II. bitwise operators (1)
Part II. bitwise operators (2)
Part II. bitwise operators (3)
上一篇討論了如何從 0xEEB422 取出 RGB,不知道有沒有人想到,那如果給的是 RGB,要怎麼轉成 16 進位的表示法呢?這一樣也可以用位元運算子做到,而且簡單很多,這個就留給大家試試看。

實例 2: 旗標的控制 (完全不知道該怎麼稱呼這招...)

假設我們想要記錄使用者喜歡看書、喜歡看影或喜歡聽音樂,可以複選。

在設計上,我們可以在資料庫開三個欄位(或利用三個變數)分別記錄這件事:但每次這樣做的時候,我總覺得很繁瑣,後來就學會利用位元運算子來達成這件事。位元是 2 進位,0 或 1,究其原理,原本就是一種開關,那不是很適合用來記錄此類事項嗎?

目前需要記錄三件事,所以就要至少要利用三個位元:
喜歡看書:001 ( 1 base 10)
喜歡電影:010 ( 2 base 10)
喜歡音樂:100 ( 4 base 10)

那喜歡看書又喜歡電影呢? 就是 011 ( 3 base 10),以此類堆。

這樣做就可以只利用一個欄位(一個變數)來紀錄喜好,那取用的時候會不會很麻煩呢?我們來試試看。

當使用者的紀錄是 6 時,我們先轉成 2 進位看看:110,如果各位還記得前兩篇的內容,應該就可以發現,利用 & 就能輕易取出自己要的資料:
6 & 1 = 0
6 & 2 = 2
6 & 4 = 4

如果是 3 呢? 3 的 2 進位是 011
3 & 1 = 1
3 & 2 = 2
3 & 4 = 0

在舉了兩個例子之後,應該可以觀察出來,& 之後還大於 0 的,就是表示有選擇該選項。

設定的時候也非常的方便,例如現在使用者的紀錄是 1,也就是原本只有選擇愛看書,後來使用者有多選了喜歡音樂,這時候只需要利用 OR 就能很輕易地做到:
1 | 4 = 5 --> 這時候只需要把 5 存起來就可以了。

如果要移除的話,也非常的簡單,假設原本使用者全選了,所以記錄為 7 (111 base 2),這時候想要移掉電影的選項,就只要把 7 跟 2 XOR 起來:
7 ^ 2 = 5 (101 base 2) 這樣就把電影給移掉了

那能不能在複雜一些,例如想要找出愛看書(1)「或」愛聽音樂(4)的人呢?

這時候就先把這兩個 OR 起來: 1 | 4 = 5
再把使用者的紀錄跟這個結果 AND 起來,AND 的結果大於 0 的,就是我們要的人。

3 & 5 = 1 > 0 所以是 愛看書(1)「或」愛聽音樂(4)的人 之一
3 = 011 雖然不喜歡音樂,但的確愛看書

2 & 5 = 0
2 = 010 是個只愛電影的人,不是我們要的人


上一篇
Javascript中的位元運算子 (2)
下一篇
Javascript中的傳遞參考與closure (1)
系列文
Javascript7
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

我要留言

立即登入留言