我正忙于一个需要在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);
}
我一直在搜索网络,但不幸的是我无法找到任何有用的东西。有人知道如何解决这个问题吗?
答案 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);
}
请注意,这不会将0
和1
放入数组中,而是放入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的宽度)