我需要-有一些(实际上是伪的)uint32随机数,我需要它是4个第一位以1st位表示,而不是0,例如
…000100101 => 1001
1000…0001 => 1000
…0001 => 0001
…0000 => 0000
等等
我知道我必须使用这样的东西
uint num = 1157 (some random number)
uint high = num >> offset
问题是-我不知道第一位在哪里,所以我不能使用>>具有恒定变量.有人可以解释如何找到这个偏移量吗?
解决方法:
您可以首先计算最高有效位(HSB),然后进行相应的移位.您可以这样:
int hsb = -4;
for(uint cnum = num; cnum != 0; cnum >>= 1, hsb++);
if(hsb < 0) {
hsb = 0;
}
uint result = num >> hsb;
因此,我们首先旨在检测最高设置位的索引(或该索引减去4).我们通过增加hsb并向右移动cnum(num的副本)来执行此操作,直到cnum中不再有任何设置位为止.
接下来,我们确保存在这样的设置位,并且它至少具有索引4(如果没有,则不执行任何操作).结果是原始num向右移了hsb.
如果在0x123上运行此命令,则在csharp交互式shell中得到0x9:
csharp> uint num = 0x123;
csharp> int hsb = -4;
csharp> for(uint cnum = num; cnum != 0; cnum >>= 1, hsb++);
csharp> if(hsb < 0) {
> hsb = 0;
> }
csharp> uint result = num >> hsb;
csharp> result
9
0x123是0001 0010 0011(二进制).所以:
0001 0010 0011
1 001
1001是9.