Это в основном соответствует технике, используемой Керреком, но выделяет сложные части:
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
, чтобы определить, следует ли включать каждый ненадежный бит, используя тот факт, что целые числа от 0
до 1023
проходят через все возможности младших 10 бит.
return values;
}
Наконец, верните массив, который мы создали. Вот краткая основная информация, которую можно использовать для тестирования со значениями A
и B
, указанными в вашем вопросе:
int main()
{
int *values = getValues(0x8A7C6BB5, 0x44444496);
int i;
for(i = 0;i < 1024;i++)
printf("%X\n", values[i]);
}