2013-06-01 100 views
5

这里我想生成一个位模式来设置n数字等于1从位置p开始。 位数从0 to 31开始编号。 以下是我所做的。使用按位运算符生成特定的位模式

int bitPattern(int n, int p) { 
    int hex, num1, num2; 
    hex = 0x80000000; 
    num1 = (hex >> (31 - p)); 
    num2 = (hex >> (31 - (n+p))); 
    return num1^num2; 
} 

实施例:

bitPattern(6, 2) should return 
..000011111100 

具有较少运营商的任何替代解决方案?

+2

当'n + p> 31'时,您正在调用未定义的行为。如果保证永远不会出现这种情况,那么您仍然有实现定义的行为,正确地移动一个负数。但是如果你不害怕UB,那么'((1 << n)-1)<< p'呢? –

+0

@DanielFischer在我的问题中'(n + p)'不会超越31.并且很容易识别太... – noufal

+1

无论如何,如果你只关心位,我建议使用无符号类型,然后'((1 << n)-1)<< p'是安全的,除非'n'或'p'是负数或大于或等于该类型的宽度。 –

回答

5

你可以这样说:

return ((1<<n)-1)<<p; 

在零的位置让n的,计算(2^n)-1;回想2^n1<<n,所以表达式变成((1<<n)-1)。现在您需要在后面添加p零,因此将结果移至p

+0

@danielFischer给出了同样的答案...谢谢你的解释... – noufal