在事件发生时,位移一次

时间:2014-11-05 10:42:40

标签: c

我正在研究一个需要增加计数器的问题。此计数器的工作方式类似于大小为3的事件存储器持有者。这意味着您可以存储在最后三个时隙期间发生的事件。

例如:

  • 在时间段0,有一个事件:set mem_holder = 001
  • 在时间段1,另一个事件:转移mem_holder与1和新事件 - > 011
  • 在第2个时段,没有任何事件,所以我们将这两个位从一个向左移位 - > 110
  • 在时间段3,没有事件再次向左移动 - > 100
  • 在时间段4,新事件 - > 001
  • 在时间段5,没有事件 - > 010
  • 在时间段6,新事件 - > 101

依旧等等

我正在寻找的是如何以适当和有效的方式解决这个问题的提示或示例。 标准是低复杂性和低内存要求,即没有大的变量分配。

我对位操作知之甚少,但我知道基本操作,例如<< | >> &安培; ^但是将它们组合在一个“大”的环境中是具有挑战性的,所以任何建议/帮助都表示赞赏!

Thx in advanced

2 个答案:

答案 0 :(得分:2)

基本上,你有一个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        

答案 1 :(得分:0)

或者你可以使用一个不那么复杂的逻辑:

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