-1

次の関数を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);
}

私は集中的にウェブを検索してきましたが、残念ながら有用なものを見つけることができませんでした。この問題に取り組む方法について誰かが考えを持っていますか?

4

5 に答える 5

1

inputs4つのネストされたループの代わりに、単一のループカウンターから配列を埋めることもできます。

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

これは、より大きなinputsアレイに合わせて拡張できます。

于 2012-09-23T19:37:41.847 に答える
0

この単純なケースでは、4つのネストされた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);
于 2012-09-23T19:31:30.010 に答える
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);
}

これは0sと1sを配列に入れるのではなく、0sまたはnon-を入れることに注意してください0(たとえば、15それは入れ[1, 2, 4, 8]ます)。

于 2012-09-23T19:34:44.647 に答える
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));
}
于 2012-09-23T19:55:27.107 に答える
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に使用するために選択した幅)で機能します。

于 2012-09-23T20:49:27.643 に答える