【问题标题】:Generating particular bit pattern using bitwise operators使用按位运算符生成特定位模式
【发布时间】:2013-05-27 22:19:52
【问题描述】:

这里我想生成一个位模式来设置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

任何具有较少运算符的替代解决方案?

【问题讨论】:

  • n+p > 31 时您正在调用未定义的行为。如果保证永远不会出现这种情况,那么您仍然有实现定义的行为右移一个负数。但是如果你不怕UB,那((1 << n) - 1) << p呢?
  • @DanielFischer 在我的问题(n+p) 不会超过 31。而且也很容易识别...
  • 无论如何,如果您只关心位,我建议使用无符号类型,然后((1 << n) - 1) << p 是安全的,除非np 为负数或大于或等于类型的宽度。
  • @DanielFischer 谢谢...我会试试...

标签: c logic bit-manipulation


【解决方案1】:

你可以这样做:

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

要使n 在零位置,计算(2^n)-1;回想一下2^n1&lt;&lt;n,所以表达式变为((1&lt;&lt;n)-1)。现在您需要在后面添加p 零,因此将结果左移p

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    相关资源
    最近更新 更多