[問題] 列舉型別enum

看板C_and_CPP作者 (brotherD)時間8年前 (2017/08/30 18:05), 8年前編輯推噓7(7024)
留言31則, 10人參與, 最新討論串1/2 (看更多)
hi,各位好。小弟在看header file的時候看到以下定義: * enum CAN_TX_MSG_FLAGS * * This enumeration values define flags related to transmission of a * CAN message. There could be more than one this flag * ANDed together to form multiple flags. enum CAN_TX_MSG_FLAGS { CAN_TX_PRIORITY_BITS= 0b00000011, CAN_TX_PRIORITY_0 = 0b11111100, // XXXXXX00 CAN_TX_PRIORITY_1 = 0b11111101, // XXXXXX01 CAN_TX_PRIORITY_2 = 0b11111110, // XXXXXX10 CAN_TX_PRIORITY_3 = 0b11111111, // XXXXXX11 CAN_TX_FRAME_BIT = 0b00001000, CAN_TX_STD_FRAME = 0b11111111, // XXXXX1XX CAN_TX_XTD_FRAME = 0b11110111, // XXXXX0XX CAN_TX_RTR_BIT = 0b01000000, CAN_TX_NO_RTR_FRAME = 0b11111111, // X1XXXXXX CAN_TX_RTR_FRAME = 0b10111111 // X0XXXXXX }; 不太能意會這一小段程式碼與註解的關係。 This enumeration values define flags related to transmission of a CAN message. There could be more than one this flag ANDed together to form mutiple flags. 請問這兩句話是什麼意思? 據我所知flag不就是一個bit?如果bit預設是0,由於觸發了某個動作,經由硬體觸發此bit 使它變成1。所以programmer可以利用此flag去判讀動作觸發了沒。 但enum裡面的識別字的值不是我們自己定義的嗎?定義完後就是定值了吧?還可以當flag使 用嗎? 以CAN_TX_PRIORITY_0為例子。為什麼要把值定義成0b11111100,不能定義成0b00000000呢 ?註解後面用X表示不就是代表可以為0或者1嗎? 接著,列舉裡面的識別字跟其他識別字作and。是指什麼意思呢? 舉個例,CAN_TX_PRIORITY_BITS跟CAN_TX_PRIORITY_0做and後,會變成0b00000000,這代 表甚麼意思呢? 謝謝各位指點。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.248.26.157 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1504087553.A.A73.html ※ 編輯: zzss2003 (60.248.26.157), 08/30/2017 18:06:25

08/30 18:28, , 1F
定義成0b11111100只是因為剛好CAN_TX_PRIORITY_BITS只要
08/30 18:28, 1F

08/30 18:28, , 2F
兩個bit 他只是剛好其中一個組合....
08/30 18:28, 2F

08/30 18:28, , 3F
這應該是CAN Bus吧... 0b是binary,所以flag是8bit
08/30 18:28, 3F

08/30 18:29, , 4F
priority只用的bit0和bit1
08/30 18:29, 4F

08/30 18:30, , 5F
你對他作and不就是代表你讓TX得priority設為0?
08/30 18:30, 5F

08/30 18:32, , 6F
你把 CAN_TX_PRIORITY_2 CAN_TX_XTD_FRAME and起來不就
08/30 18:32, 6F

08/30 18:33, , 7F
有意思了 那些BITS和PRIORITY_BITS是mask 取出值用的
08/30 18:33, 7F

08/30 18:34, , 8F
MOONRAKER大說得精準, 請依照他的說法為準XD
08/30 18:34, 8F

08/30 18:47, , 9F
就是mask
08/30 18:47, 9F

08/30 22:46, , 10F
不就是flag 跟mask嗎...
08/30 22:46, 10F

08/30 22:47, , 11F
定值跟不能當flag的關聯是?
08/30 22:47, 11F

08/31 01:05, , 12F
不同系列的值可以 and 起來做組合
08/31 01:05, 12F

08/31 01:06, , 13F
然後名稱帶 BIT 是拿來做檢查 on/off 用的 mask
08/31 01:06, 13F

08/31 01:08, , 14F
填 1 做 and 的時候才不會影響別人
08/31 01:08, 14F

08/31 13:24, , 15F
其實我不太懂這裡為什麼要用enum
08/31 13:24, 15F

08/31 13:24, , 16F
用#define或const應該也都可以
08/31 13:24, 16F

08/31 14:45, , 17F
#define,const可以,但SoC上效率/空間至上
08/31 14:45, 17F

08/31 14:46, , 18F
bit wise比 if 更有效率,以該例只需要用到1byte就可以
08/31 14:46, 18F

08/31 14:46, , 19F
定三種flags,才是最有效率的作法
08/31 14:46, 19F

08/31 14:59, , 20F
更正,是4bytes
08/31 14:59, 20F

08/31 15:14, , 21F
呃... 這個例子是1byte
08/31 15:14, 21F

08/31 16:36, , 22F
用enum好處是可以讓compiler幫忙做型別檢查,不過好像要
08/31 16:36, 22F

08/31 16:36, , 23F
看compiler的樣子
08/31 16:36, 23F

08/31 20:03, , 24F
型別檢查的話用const int也可以做到一樣的效果吧?
08/31 20:03, 24F

08/31 20:03, , 25F
我想enum的好處是閱讀的人能一眼看出這些是同一件事(?)
08/31 20:03, 25F

08/31 20:48, , 26F
這是普通的flag及mask用法 但它稍微反過來做
08/31 20:48, 26F

08/31 20:50, , 27F
他的flag是0不是1 沒有set的位元必須是1
08/31 20:50, 27F

08/31 20:51, , 28F
所以CAN_TX_PRIORITY_0前面才都是1不是0
08/31 20:51, 28F

08/31 20:51, , 29F
並且用AND來combine flags 而不是一般的OR
08/31 20:51, 29F

08/31 20:52, , 30F
我想就是那句話要表達的意思
08/31 20:52, 30F

08/31 21:27, , 31F
08/31 21:27, 31F
文章代碼(AID): #1Pfeu1fp (C_and_CPP)
文章代碼(AID): #1Pfeu1fp (C_and_CPP)