作者HILL33LOVE (就是愛希爾)
看板C_and_CPP
標題[問題] 位元運算 循環式計算出位元
時間Tue Jul 9 01:51:15 2013
大家好,最近想要實踐一個功能
就是我用一個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
→ EdisonX:我的想法不同吶,這種案例可以直接針對原始資料直接做右旋 07/09 11:58
→ EdisonX:1234 -> 4123 -> 3412 -> 2341 -> 1234 ( 應是叫右璇吧?) 07/09 12:00
→ MOONRAKER:右旋沒錯,可以用>>, &, | 各一個做出來。 07/09 12:26
→ HILL33LOVE:很笨的方法 要掃兩次 不曉得有沒有更好的方式呢? 謝謝 07/09 22:44
→ fakeqq:有 bug 改過才能動 07/10 01:47