iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0
自我挑戰組

Bug仔的筆記本系列 第 24

複選選了什麼?用位元運算 "&" 、 " |" 知道 Check Box 選了什麼!(二)

  • 分享至 

  • xImage
  •  

今天的文章接續上次的主題,這次我們有 4個選項

https://ithelp.ithome.com.tw/upload/images/20221009/20120420479TP7S9LY.png

當你勾選了兩個選項,你可能會把結果這樣存在陣列。

['加香菜','加筍絲']

而要知道有沒有加香菜,就對陣列做搜尋
https://ithelp.ithome.com.tw/upload/images/20221009/20120420Sh3NbH5YZF.png

如果用二進位來表示就會是這樣
https://ithelp.ithome.com.tw/upload/images/20221009/20120420RZlr8kWY8c.png

資料表示為 5 ,代表有加香菜加筍絲

5 = 1 + 4

要知道有沒有加筍絲(1)就用 &
https://ithelp.ithome.com.tw/upload/images/20221009/20120420SQmBevucTt.png

如果要問有沒有加滷蛋(2),就是這樣算。

(5 & 2) == 2
// false

https://ithelp.ithome.com.tw/upload/images/20221009/20120420SVErseHff6.png

所以回到上次文章提到的判斷式,15 = 8 + 4 + 2 + 1,代表四個選項都有勾的意思

if(( i & 15 ) == 15 ){
    // 後續動作...
}

## C# Enum Flages

C# 裡面也可以用 & | 做位元運算,此外還可以使用列舉型別做具名的位元元算

[Flags]
public enum 加料
{
	加香菜=1,
	加滷蛋=2,
	加筍絲=4,
	加油豆腐=8,
	全都要 = 加香菜 | 加滷蛋 | 加筍絲 | 加油豆腐
}

這樣就變成

// (5 & 2) == 2
(5 & (int)加料.加滷蛋) == (int)加料.加滷蛋

結語

Linux的權限邏輯也是用位元運算來表示,不過只是一種表示選項的方法,這裡的優點就是一個數字紀錄多種組合。也能用程式判斷出有勾那個項目,並節省記憶體或是資料庫的儲存空間。不過現在硬碟容量不用錢的,拆成多筆儲成陣列也是會比較好維護。畢竟如果沒有 C# Enum 具名代表的話。文件遺失的話,後續的人也無法從程式推敲出 5 代表什麼意思。


上一篇
Visual Studio 發布出去的專案檔案不是最新版?
下一篇
讓 Visual Studio 2022 可以像 VS Code 使用 Ctrl + D 選取下一個同名項目
系列文
Bug仔的筆記本30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言