有没有办法可以获得任何整数的低阶 n 位(其中 n 可以是1到32之间的任何数字),而无需事先预先计算32位掩码,每个订单一个,并使用&
运算符?我也不想使用权限为2的%
,只是按位操作。
编辑:例如,假设用户输入一个整数Num
和另一个整数ShiftCount
,其值介于1到32之间。我想存储第三个变量是在操作Num >> ShiftCount
中丢失的位。
答案 0 :(得分:10)
像Num & ((1 << ShiftCount) - 1)
?
答案 1 :(得分:3)
这个解决方案怎么样?这是严格的比特 - 没有数学要求:
public static int LowOrderBits( int value , int bits )
{
if ( bits < 0 || bits > 32 ) throw new ArgumentOutOfRangeException("bits") ;
return (int) ( ((uint)value) & ~(0xFFFFFFFF << bits) ) ;
}
@ jdv-Jan de Van的解决方案需要减法,@ Mark 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) ) ) ;
}
减法可能比简单的位操作更昂贵。
答案 2 :(得分:0)
如何从1111 ... 1111(UInt32.MinValue)开始,右移它n位(确保使用uint,因此它不会签名扩展!),然后&amp; -ing it with the it你想要低阶位的值?