生成随机数(i,j)
一对数字,其中i < 16
和j < 8
。如果没有设置位置B[i]&(1<<j)
上的位,则将其设置并递增“计数”。循环直到“计数”达到“n”。
的代码(未经测试)的位:
void generate_n_bit_mask (unsigned char B[], int n)
{
// avoid infinite loop later on.
for (int i=0; (i < 16); ++i) {
B[i] = 0;
}
// invariant: k is number of currently masked bits.
for (int k = 0; (k < n);)
{
// select bit at random.
int i = rand() % 16;
int j = rand() % 8;
unsigned char mask = 1 << j;
// set it if not selected previously.
if ((B[i]&mask) == 0) {
B[i] |= mask, ++k;
}
}
}
练习,为的挑战:从代码中删除幻常量16
。
编辑:在您的意见建议修改包含一个讨厌的错误。这里是一个测试程序,用于在输出掩码中分配位的方式。
#include <iostream>
#include <iomanip>
#include <ctime>
void generate_n_bit_mask (unsigned char B[], int n)
{
// avoid infinite loop later on.
for (int i=0; (i < 16); ++i) {
B[i] = 0;
}
// invariant: k is number of currently masked bits.
for (int k = 0; (k < n);)
{
// select bit at random.
int i = std::rand() % 16;
int j = std::rand() % 8;
unsigned char mask = 1 << j;
// set it if not selected previously.
if ((B[i]&mask) == 0) {
B[i] |= mask, ++k;
}
}
int j = 0;
}
// count number of set bits in a byte.
int bit_count (unsigned char x)
{
int n = 0;
for (int i = 0; (i < 8); ++i) {
n += ((x >> i) & 1);
}
return (n);
}
// count number of set bits in 16 bytes.
int total_bit_count (unsigned char B[])
{
int n = 0;
for (int i = 0; (i < 16); ++i) {
n += bit_count(B[i]);
}
return (n);
}
int main (int, char **)
{
std::srand(std::time(0));
unsigned char B[16];
// for all possible values of "n"
for (int i = 0; (i <= 16*8); ++i)
{
// generate a 16 byte mask with "n" set bits.
generate_n_bit_mask(B, i);
// verify that "n" bits are set.
int n = total_bit_count(B);
if (n != i) {
std::cout << i << ": " << n << std::endl;
}
}
}
当运行此程序,它会尝试从n
到0
每16*8
价值并产生n
位的随机掩码,然后验证准确n
位设置。如果出现任何错误(的n
一些值,一些k!=n
位被设置),消息被输出。
如果我改变条件if ((B[i]^mask) != 0)
,我得到的输出一致的错误。每次运行都会产生至少1条错误消息。原始条件if ((B[i]&mask) == 0)
始终生成0个错误消息。
你说你的要求很好,但你没有说明你做了什么,你的想法是解决这个问题。这看起来像家庭作业&除非你发布你的努力,这将很快关闭。 –
这不是作业......但我可以发布我的努力 – drdot