我有一个32位随机值(比方说631).
0...0000001001110111
每个位都是一个标志.如果可能的话,我想从这些位返回一个随机标志,进行O(1)操作.如何从给定值中选择位位置0,1,2,4,5,6或9(或它的对应值1,2,4,16,32,64,512)631?优选地,对于某些位具有至少可能的偏置.
我提出的事情:
上面不是O(1),如果我们碰巧只"击中"0位,可能需要多次迭代.
同样,不幸的是,上面不是O(1).
我很确定这必须是可能的,有些bithisfting/masking /魔法......
编辑:
正如CodeCaster建议的那样 ; 这将给我所有设置位值:
int myvalue = 631;
var matchingmasks = Enumerable.Range(0, 32)
.Select(i => 1 << i)
.Where(i => (myvalue & i) == i)
.ToArray();
Run Code Online (Sandbox Code Playgroud)
从结果数组中我可以选择一个随机元素,我将从给定值中找到我的"随机"位(标志).但是,这仍然需要一个(隐藏的,因为Linq)for循环,"强制"每个可能的位,结果数组的内存分配等.