2

Is there a way to pick a value based on the bit position. The problem statement is:- for a 16 bits position, I can set any bits, say I set 1,4,6,7,11,13 bit so the mask would be:-

Bit Positons 0 0 1 0 1 0 0 0 1 1 0 1 0 0 1 0

Now I need to randomly pick a value based on this bit mask, where only 1 bit is set, so my possible values could be:-

For selecting 4 :0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0

For Selecting 7: 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0

But I need to select this value randomly, so I though of doing it like this

1)Create an Array based on the bit mask, so for 16 bit , the array would have 16 unique values.

2) Now do the rand operation on the array position to get the array index.

3) Use the value at that array index.

Is there a better way of doing it?

4

4 回答 4

3

如果我理解正确,您想要一个在掩码中也设置了一个位的数字。

为此,我将创建一个 while 循环,在 0 到 16 之间选择一个随机值,直到找到一个也设置在掩码中的值:

uint16_t mask = 0x28d2; /* == 0 0 1 0 1 0 0 0 1 1 0 1 0 0 1 0 */
int bit = 0;

do{
    bit = 1 << (rand() % 16); /* sets one random bit between 1 and 16 */
}while(!(mask & bit)); 

/* bit has now exactly one bit set that is also set in mask */
于 2013-10-08T00:00:07.620 回答
1

如果目标是最后设置一个最多一位的值,则不需要该数组。您可以简单地随机生成一个 0-15 之间的值,然后将该值左移 1 以获取用于选择该位的掩码,如下所示:

uint16_t myValue = 0xA5;
int shiftValue = rand() % 16;
uint16_t randomMask = 1u << shiftValue;
uint16_t randomValue = myValue & randomMask;

如果您需要一个在末尾恰好设置了一个位的值,那么它会变得有点棘手。那时,您可以或多或少地按照您所说的做,并使用一个数组来存储设置的位的位置(例如[1, 4, 6, 7, 11, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],使用零来指示何时没有更多位设置),然后生成一个随机索引到包含有效索引的数组部分。当然也有其他方法可以做到这一点,但这种方法对于未来的代码读者来说似乎相当清楚(尽管我仍然会谨慎地评论这一点,因为位操作会很快变得混乱)。

(顺便说一句,生成随机数的方法比 好得多rand(),如果您需要任何接近真正随机性的东西,您可能应该使用其中一种方法 - 我只是在这里使用它作为一种方便的速记,因为实际的 RNG 并不重要。)

于 2013-10-07T23:57:41.890 回答
0

你可以这样做:

bitMask = 0x28d2;

randomNum = rand() % 16;
randomBit = (1<<randomNum) & bitMask;
于 2013-10-07T23:57:30.113 回答
0

如果您只想设置一个位,则可以使用重试循环或类似的方法:(添加适当的定义并可能为 添加特殊情况mask == 0

while (mask)
{
    array[i++] = mask & -mask;
    mask &= mask - 1;
}
return array[rand_in_range(0, i)];

whererand_in_range(a, b)是一个返回 [a, b> 范围内的随机数的函数(请注意,99% 的实现rand_in_range是不正确的,而在大多数测试中似乎是正确的,这是最糟糕的错误)。

于 2013-10-08T00:05:01.870 回答