2011-03-18 55 views
2

早上好,下午或晚上,获取低阶n位

有什么办法,你可以得到任何整数的低位ñ位(其中ñ可以是1到32之间的任意数字)之前没有预先计算32位掩码,每个订单一个,并使用&运算符?我也不想使用%两个幂,只是按位操作。

编辑:说,例如,该用户输入的整数Num和另一个整数ShiftCount取值范围往复1〜32我想在第三变量来存储一个值,该值是在操作Num >> ShiftCount丢失的位。

非常感谢。

+0

你想掩盖更高的位?或者获取低位作为bools/ints? – Ani 2011-03-18 15:59:23

回答

10

类似Num & ((1 << ShiftCount) - 1)

+0

这听起来不错! – Miguel 2011-03-18 16:04:29

0

如何从1111 ... 1111(UInt32.MinValue)开始,将它右移n位(确保使用uint使其不能签名扩展!),然后使用你想要低位的值?

2

这个解决方案如何?它是严格位变换—无需数学:

public static int LowOrderBits(int value , int bits) 
{ 
    if (bits < 0 || bits > 32) throw new ArgumentOutOfRangeException("bits") ; 
    return (int) (((uint)value) & ~(0xFFFFFFFF << bits)) ; 
} 

@ JDV-简·德·范的解决方案需要减法,做@马克Sowul的(获得价值n

public static int LowOrderBits(int value , int bits) 
{ 
    if (bits < 0 || bits > 32) throw new ArgumentOutOfRangeException("bits") ; 
    return (int) (((uint)value) & (0xFFFFFFFF >> (32-bits))) ; 
} 

减法可能比简单的位操作更昂贵的操作