C#从第一个有效位开始获取uint32的高4位

我需要-有一些(实际上是伪的)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.

上一篇:thrift Linux调用


下一篇:性能学习随笔(1)--负载均衡之f5负载均衡