这基本上遵循了 Kerrek 使用的技术,但充实了困难的部分:
int* getValues(int value, int unreliable_bits)
{
int unreliables[10];
int *values = malloc(1024 * sizeof(int));
int i = 0;
int mask;
函数定义和一些变量声明。在这里,value
是你的A
,unreliable_bits
是你的B
。
value &= ~unreliable_bits;
屏蔽掉不可靠的位以确保对包含一些不可靠位的整数进行 ORing 并value
产生我们想要的结果。
for(mask = 1;i < 10;mask <<= 1)
{
if(mask & unreliable_bits)
unreliables[i++] = mask;
}
在这里,我们将每个不可靠的位放入一个单独的 int 以供以后使用。
for(i = 0;i < 1024;i++)
{
int some_unreliables = 0;
int j;
for(j = 0;j < 10;j++)
{
if(i & (1 << j))
some_unreliables |= unreliables[j];
}
values[i] = value | some_unreliables;
}
功能的肉。外循环覆盖了我们想要的每个输出。然后,我们使用循环变量的最低 10 位i
来确定是否打开每个不可靠位,利用整数遍历最低 10 位的所有可能性这一0
事实1023
。
return values;
}
最后,返回我们构建的数组。这是一个简短的主要内容,可用于使用您的问题中给出A
的值来测试它:B
int main()
{
int *values = getValues(0x8A7C6BB5, 0x44444496);
int i;
for(i = 0;i < 1024;i++)
printf("%X\n", values[i]);
}