看板 C_and_CPP 關於我們 聯絡資訊
大家好,最近想要實踐一個功能 就是我用一個16位元int (current_state)表示16個選項 int current_state = 0x16c1; //0001 0110 1100 0001 假設目前選項是第六個,那我想要計算下一個選項的位元(第七個) 又能有循環的效果,就是第十二個完下一個變成第0個 下一個變成第六個這樣下去 目前只能選下一個,不過不能夠變成循環式的 int current_bit = 6; //6->7->9->10->12->0->6->7->.. 想問大家用什麼技巧可以達成呢? 謝謝!! [程式如下]: #include <stdio.h> #define BIT(x) ((1 << x)) int Calculation(int b, int current_bit) { int idx = 0, jdx = 0; int chose_bit = 0; int mask = BIT(current_bit); printf("mask = 0x%x\n", mask); for (idx = 0; idx < 16; ++idx) { if ((b & mask) != 0) { jdx++; if(jdx == 2) break; } else ; mask <<= 1; } chose_bit = current_bit + idx; printf("chose_bit = %d\n", chose_bit); return chose_bit; } int main(void) { int current_state = 0x16c1; //0001 0110 1100 0001 int next_bit = 0; int current_bit = 6; //6->7->9->10->12->0->6->7->... printf("current_state = 0x%x\n", current_state); next_bit = Calculation(current_state, current_bit); printf("\nnext_bit = %d\n", next_bit); return 0; } Linux OS -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.168.189.60
sitos:如果離開 for 的時候 jdx 只有 1 而不是 2 , 07/09 02:07
sitos:就代表現在已經是最後一個 state ,這時再去抓第一個出來, 07/09 02:08
sitos:就可以完成循環了。 07/09 02:08
xvid:http://codepad.org/nroBX9HJ 07/09 02:27
EdisonX:我的想法不同吶,這種案例可以直接針對原始資料直接做右旋 07/09 11:58
EdisonX:1234 -> 4123 -> 3412 -> 2341 -> 1234 ( 應是叫右璇吧?) 07/09 12:00
MOONRAKER:右旋沒錯,可以用>>, &, | 各一個做出來。 07/09 12:26
HILL33LOVE:http://codepad.org/YBg09JAd 07/09 22:43
HILL33LOVE:很笨的方法 要掃兩次 不曉得有沒有更好的方式呢? 謝謝 07/09 22:44
fakeqq:http://codepad.org/ojweyc87 07/10 01:44
fakeqq:有 bug 改過才能動 07/10 01:47