→ holik0123:可以解釋一下他這樣用的意思嗎? 08/16 22:26
假設我現在有八個 flag (f0—f7) 要存在七個位元裡
我一開始設 f1 f4, 那會變成 00010010 (msb 是 f7)
那如現在我想改一個 flag f6 的值
f6 = 0100000
flags = 00010010
那麼我就 flags |= f6
flags 00010010
OR f6 01000000
———————————
01010010
就達到我想要的目的了
& 剛好相反, 是想消去某個(或某些)flag 的時候用
例如剛剛的 01010010 如果我現在想消去 f1
那麼 flags &= ~f1
flags 01010010
AND ~f1 11111101
———————————
01010000
--
╱ ̄ ̄ ̄╲
▏◢█◣ ▏
︻█︻█ ▏ 成龍表示: 是喔...
′/ ‵ ▏
╰╯ █╱
ψQSWEET ◥︶█◤
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.81.146
推 holik0123:多謝解答,被秒殺 08/16 22:35
推 x000032001:酷耶XD 08/16 23:08
推 goodrain:好精簡的寫法~ 就不用在那邊拆數字半天了 08/17 00:10
推 hilorrk:去年修OS 在uC/OS-II的source code裡看到很多這種用法 08/17 00:50
→ hilorrk:看久了就習慣了XD 08/17 00:50
→ loveme00835:標準庫就有這種用法呀! 不用跑去看源碼來熟悉這個啦 08/17 01:03
→ hilorrk:還有些判斷指定flag set(any/or)是否被set/clear的用法 08/17 01:09
→ hilorrk:constant time查找task、event之類的..一開始看真會頭昏@@ 08/17 01:10
推 ducksteven:沒有很遠啦,MapleBBS 裡面就一堆 orz 08/17 02:25
推 softwind:typedef struct{ 08/17 02:34
→ softwind: int flagA:1; 08/17 02:34
→ softwind: int flagB:1; 08/17 02:34
→ softwind: int flagC:1; 08/17 02:34
→ softwind:} S_MY_STRUCT; 08/17 02:35
→ softwind:S_MY_STRUCT my; if(my.flagA&1) {/* do something.*/} 08/17 02:35
→ softwind:我覺得這種表達式 比用 bit+shift 來的好 08/17 02:36
→ loveme00835:我比較習慣玩 bitset ^^" 08/17 02:50
→ loveme00835:不過定義不同遮罩再用 & 也蠻直覺的說 08/17 03:17
→ tomnelson:We often call these "bit-mask"... 08/19 18:07
→ tomnelson:這篇寫得很好! 08/19 18:07