ランダムに生成された命令セットに基づく単純な仮想マシンを作成しようとしています。Cで、Nビットが設定されたランダムビットマスクを生成する最良の方法は何ですか( Nビットが設定されていることが保証されていないため、ランダム整数を生成するのと同じではありません)。これは、16 ビット整数と 32 ビット整数の両方で機能する必要があります。
編集:正確にNビットを設定する必要があります。まさに。それ以上ではありません。そしてそれ以下ではありません。正確に N ビットが設定されています。非常に安全である必要はなく、宇宙ノイズからエントロピーを取得する必要もありません。疑似ランダムでなければなりません。
これは私が実際に達成しようとしているものです:
uint32_t rand_bits_32(size_t reqBits)
{
/* blah */
}
uint16_t rand_bits_16(size_t reqBits)
{
/* blah */
}
extern char *int2bin(uint32_t n, char *buf);
uint16_t gen_mask_16_excl_32(uint32_t* exclude, size_t exclude_count, size_t bits_required)
{
uint32_t ret = 0;
while (1) {
bool has = false;
ret = (uint32_t)rand_bits_16(bits_required);
for (size_t i = 0; i < exclude_count; i++) {
if (ret & (uint32_t)exclude[i]) {
has = true;
break;
}
}
if (!has) {
break;
}
has = false;
}
return ret;
}
uint32_t gen_mask_32(uint32_t* exclude, size_t exclude_count, size_t bits_required)
{
uint32_t ret = 0;
while (1) {
bool has = false;
ret = rand_bits_32(bits_required);
for (int i = 0; i < exclude_count; i++) {
if (ret & (uint32_t)exclude[i]) {
has = true;
break;
}
}
if (!has)
break;
has = false;
}
return ret;
}
ランダムなビットを生成AND
し、一致するビットがなくなるまで既存のビットマスクに対してそれらをブルートフォースします。そのため、N 個のビットを持ち、他のビットマスクと共通するビットをまったく持たないビットマスクを生成できます。はい、このコードはひどいもので、x86_64 では壊れます。