[問題] 使用巨集同時改變變數中兩個位元

看板C_and_CPP (C/C++)作者 (喵食罐頭)時間12年前 (2013/06/18 11:20), 編輯推噓2(2010)
留言12則, 3人參與, 最新討論串1/1
使用的編譯器為 GCC,在單晶片上位元操作是常做的事情,通常我們都會寫成 #define P_BSF(var, bit) ((var) |= (1LL << (bit))) /*PIC16F*/ #define P_BCF(var, bit) ((var) &= ~(1LL << (bit))) 來控制單一 bit 想請問今天如果想同時控制兩個 bit(或更多)呢? 因為如果寫成 #define P_BSF2(var, bit) ((var) |= (1LL << (bit)))&&((var) |= (1LL << (bit+4))) 雖然很直覺,但在組語部份就很明顯是做兩次所以不是同時改變 不知道各位有何意見和比較好的作法? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.117.222

06/18 12:05, , 1F
((var) |= ((1LL << (bit)) | (1LL << ((bit)+4))))
06/18 12:05, 1F

06/18 12:06, , 2F
如果 bit 是常數的話右邊會在編譯時做掉
06/18 12:06, 2F

06/18 12:07, , 3F
或者也可以用 ((var) |= (0x11LL << (bit)))
06/18 12:07, 3F

06/18 12:07, , 4F
這是從 (1 | (1<<4)) << (bit) 的想法來的
06/18 12:07, 4F

06/18 12:14, , 5F
雖然兩種寫法在組與看來都是一樣,但第2種作法真是太妙了
06/18 12:14, 5F

06/18 12:14, , 6F
學到新的招式 謝謝 <(_ _)>
06/18 12:14, 6F
LPH66大的方法很受用,不過我又遇到問題了 如果今天我想讓 00000000 變成 00100000 00001111 變成 01001011 似乎沒辦法同時達成 我試著寫成 #define P_BCFS(var, bit) ((var) ^= (0b10001 << (bit))) 才想到在 XOR下 會變成如下 int i = 0 P_BCFS(i, 2)變成 00100010 請問有沒有好方法解決呢 謝謝 ※ 編輯: kikiqqp 來自: 122.116.117.222 (06/18 14:08)

06/18 14:42, , 7F
如果又要設 on 又要設 off 的話只好做兩次
06/18 14:42, 7F

06/18 14:43, , 8F
不過如果是 toggle (on<->off) 的話倒是能用 XOR
06/18 14:43, 8F

06/18 14:44, , 9F
順帶一提, 雖然我前面推的是同時 on 多個 bit
06/18 14:44, 9F

06/18 14:44, , 10F
但稍做修正也能做同時 off 多個 bit
06/18 14:44, 10F

06/18 14:54, , 11F
了解了,看來我真的要求太多 >_<
06/18 14:54, 11F

06/19 00:13, , 12F
文章代碼(AID): #1Hlz8PwR (C_and_CPP)
文章代碼(AID): #1Hlz8PwR (C_and_CPP)