2014-11-05 83 views
0

我正在查看需要增加計數器的問題。此計數器的作用類似於大小爲3的事件存儲器。這意味着您可以存儲最近三個時間段內發生的事件。在事件發生時移位一次

例如:

  • 在時隙0,有一個事件:設置mem_holder = 001
  • 在時隙1中,另一事件:用1移mem_holder和和新的事件 - > 011
  • 在時隙2中,任何情況下,所以我們兩個位與一個左移 - > 110
  • 在時隙3,無事件再次轉移既左 - > 100
  • 在時隙4中,新的事件 - > 001
  • 在時隙5,任何情況下 - > 010
  • 在時隙6,新的事件 - > 101

等等等等

我所尋找的是一個提示或一個如何以適當和有效的方式解決這個問題的例子。 該標準是低複雜度和低內存要求,即沒有大的變量分配。

我對位操作知之甚少,但是我知道基礎知識,例如< < | >> & ^但在「大」的背景下將它們結合在一起是具有挑戰性的,所以任何建議/幫助都是值得讚賞的!在先進

+1

你已經介紹瞭如何做到這一點,所以我真的不明白你想要什麼我們告訴你 – harold 2014-11-05 10:45:06

+2

'&&'不是一個*位操作* – 2014-11-05 10:49:22

+0

我希望有一些實現導向的建議,例如如何將給出的示例帶入實際的代碼示例 – KapaA 2014-11-05 10:50:58

回答

2

基本上

THX,你有3位整數,這意味着它可以從B000舉辦值B111,所以0〜7如果你和任何整數7,你清楚了什麼但最右邊的3位。

所以,你做了什麼,是你左移一位爲新位置,然後按位置 - 和7.最新的最右邊的位現在爲0,因爲你的左移。在此之後,如果有新事件,則使用按位或 - 將最右邊的位設置爲1。

#include <stdio.h> 

void mark(int new_event) { 
    static int bits = 0; 

    /* Shift the bits one left to make place for the new event bit. 
    * Make sure only 3 bits are used. */ 
    bits <<= 1; 
    bits &= 7;   /* 7 is in binary 111, all other bits get removed */ 

    /* Put in the rightmost bit a 1 if new_event is 'true', else it's 
    * already zeroed-out due to the above leftshift */ 
    if (new_event) 
     bits |= 1; 
    /* Note: if you're sure that new_event can only have values 0 and 1, then 
    * you can do an unconditional: 
    * bits |= new_event 
    */ 

    /* Output what we've done for demo purposes */ 
    printf("New event: %d. Bits: ", new_event); 
    putchar(bits & 4 ? '1' : '0'); 
    putchar(bits & 2 ? '1' : '0'); 
    putchar(bits & 1 ? '1' : '0'); 
    putchar('\n'); 
} 

int main() { 
    /* at time slot 0, there was a event: set mem_holder = 001 
     at time slot 1, another event: shift mem_holder with 1 
         and and the new event -> 011 
     at time slot 2, no event so we shift both bits with one to left -> 110 
     at time slot 3, no event shift both again to left -> 100 
     at time slot 4, new event -> 001 
     at time slot 5, no event -> 010 
     at time slot 6, new event -> 101 
    */ 
    mark(1); 
    mark(1); 
    mark(0); 
    mark(0); 
    mark(1); 
    mark(0); 
    mark(1); 

    return 0; 
} 

輸出:

New event: 1. Bits: 001 
New event: 1. Bits: 011 
New event: 0. Bits: 110 
New event: 0. Bits: 100 
New event: 1. Bits: 001 
New event: 0. Bits: 010 
New event: 1. Bits: 101   
0

另外,您可以使用一個不那麼複雜的邏輯:

mem_holder = (mem_holder*2)%8 + event 
where event can take values [0,1]. 
+0

好吧,它並不比mem_holder =((mem_holder << 1)&7)|更復雜。事件,對吧? – 2014-11-05 22:00:27

+0

這裏的所有操作都比比特等價的更復雜,並且僅僅是等價的,因爲它們是碰巧很簡單的特殊情況。 – harold 2014-11-06 08:47:19

相關問題