【问题标题】:More elegant solution for multiple bit shifts更优雅的多位移位解决方案
【发布时间】:2012-09-26 16:58:17
【问题描述】:

让我们获取一个位掩码状态字节数组:

char status[10];

现在,假设我们要从每个状态字节中取出第 3 位并将它们放入一个 int 中,其中 int 的 LSB 是 status[0] bit 3,下一个是 status[1] bit 3,以此类推.

int foobits = 0;
for( i = 0; i < 10; i++ )
{
    foobits |= (( status[i] & 0x04 ) >> 2) << i;
}

我的问题是:是否有另一种方法来完成这项工作,只需要一个班次?

编辑:我正在尝试使用 foobits 来包含 status[i] bit #3s 的位数组。

【问题讨论】:

  • 你为什么要担心换班?无论如何,在大多数 CPU 上,它都是一条 CPU 指令。
  • 它可以在数据只移动一次的情况下完成,但它的代码更多,速度也更慢。这段代码和它将会得到的一样好。
  • 感谢您的意见。我只是好奇是否有更好的方法,因为我会做很多这样的事情......
  • 这个问题可能更适合code review stackexchange
  • @MooingDuck 不正确......看我的回答。这是一个从循环中分解常数的情况。

标签: c bit-manipulation


【解决方案1】:

你可以这样做

int foobits = 0;
for( i = 0; i < 10; i++ )
{
    foobits |= (status[i] & 0x04) << i;
}
foobits >>= 2;

但是为什么要麻烦呢?

“过早的优化是万恶之源。” ——唐纳德·克努斯

【讨论】:

    猜你喜欢
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    相关资源
    最近更新 更多