C中的二进制计数器

时间:2012-09-23 19:27:06

标签: c binary counter

我正忙于一个需要在C

中实现以下功能的项目
void logic_circuit(int inputs[4],int outputs[2])

需要创建一个计数器,因为需要将所有4位组合插入到此函数中...

void logic_circuit(int inputs[4],int outputs[2])
{
      //some calculations
      outputs[0] = ...
      outputs[1] = ...
}

//allocate memory
int inputs[4];
int outputs[2];

for(0000 to 1111)
{
     logic_circuit(0000,outputs);
}

我一直在搜索网络,但不幸的是我无法找到任何有用的东西。有人知道如何解决这个问题吗?

5 个答案:

答案 0 :(得分:1)

您可以从单个循环计数器填充inputs数组,而不是四个嵌套循环,

for(mask = 0; mask < 0x10; ++mask) {
    for(index = 0; index < 4; ++index) {
        inputs[index] = (mask >> index) & 1;
    }
    logic_circuit(inputs, output);
}

可以更好地扩展到更大的inputs数组。

答案 1 :(得分:0)

对于这个简单的情况,四个嵌套的for循环应该起作用:

for (inputs[0] = 0; inputs[0] < 2; ++inputs[0]) {
  for (inputs[1] = 0; inputs[1] < 2; ++inputs[1]) {  
    for (inputs[2] = 0; inputs[2] < 2; ++inputs[2]) {
      for (inputs[3] = 0; inputs[3] < 2; ++inputs[3]) {
        logic_circuit(inputs, outputs);
      }
    }
  }
}

对于较大的输入,这非常烦人。递归方法可以更好地扩展:

void enumerate_bits(int* bits, int n) {
  int bit;
  if (n == 0) {
    logic_circuit(bits, outputs);
  } else {
    for (bit = 0; bit < 2; ++bit) {
      bits[n-1] = bit;
      foo(bits, n-1);
    }
  }
}

enumerate_bits(inputs, 4);

答案 2 :(得分:0)

您可以简单地从0计算到15并将这些位提取到数组中:

for (int i=0; i <= 15; i++) {
    inputs[0] = i & 0x1;
    inputs[1] = i & 0x2;
    inputs[2] = i & 0x4;
    inputs[3] = i & 0x8;
    logic_circuit(inputs, outputs);
}

请注意,这不会将01放入数组中,而是放入0 s或非0 s(例如15 1}}它会放入[1, 2, 4, 8])。

答案 3 :(得分:0)

使用位掩码很好,但使用数组很容易,而且大小没有限制:

// produce next combination of inputs, returning false if it has cycled back to all off
bool increment(bool* ary, int len)
{
    for( int i = 0; i < len; i++ )
        if( (ary[i] = !ary[i]) )
            return true;

    return false;
}

void enumerate(void)
{
    bool inputs[4];
    memset(inputs, 0, sizeof inputs);

    // loop over all combinations of inputs
    do
    {
        logic_circuit(inputs, outputs);
    } while (increment(inputs, 4));
}

答案 4 :(得分:0)

for(int i=0; i < bitSize; i++){
    if(outputs[i]==1){        
        outputs[i] = 0;
        continue;
    }
    if(outputs[i]==0){ 
        outputs[i] = 1;
        logic_circuit(inputs, outputs);
        i = 0;
    }
}

如果您不想使用位数组,可以使用像这样的位掩码

int mask = 1;
outputs[i] &= mask << i; 

这将适用于任何大小的数组(或者如果你想使用掩蔽方法,你选择用于int的宽度)