これは基本的に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;
信頼できないビットをマスクして、信頼できないビットを含む整数をOR演算すると、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ビットを使用して、整数が下位10ビットのすべての可能性を通過するi
という事実を使用して、信頼できない各ビットをオンにするかどうかを決定します。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]);
}