看板 C_and_CPP 關於我們 聯絡資訊
使用的編譯器為 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
LPH66:((var) |= ((1LL << (bit)) | (1LL << ((bit)+4)))) 06/18 12:05
LPH66:如果 bit 是常數的話右邊會在編譯時做掉 06/18 12:06
LPH66:或者也可以用 ((var) |= (0x11LL << (bit))) 06/18 12:07
LPH66:這是從 (1 | (1<<4)) << (bit) 的想法來的 06/18 12:07
kikiqqp:雖然兩種寫法在組與看來都是一樣,但第2種作法真是太妙了 06/18 12:14
kikiqqp:學到新的招式 謝謝 <(_ _)> 06/18 12:14
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)
LPH66:如果又要設 on 又要設 off 的話只好做兩次 06/18 14:42
LPH66:不過如果是 toggle (on<->off) 的話倒是能用 XOR 06/18 14:43
LPH66:順帶一提, 雖然我前面推的是同時 on 多個 bit 06/18 14:44
LPH66:但稍做修正也能做同時 off 多個 bit 06/18 14:44
kikiqqp:了解了,看來我真的要求太多 >_< 06/18 14:54
xvid:http://codepad.org/JtsULrrg 06/19 00:13