在C / C ++中对“每隔一位”进行子集的最简单方法是什么?

时间:2016-10-24 10:15:20

标签: c++

例如,

unsigned char a = 0b11010010;

我想为每个其他位设置a的子集并将它们放在一起以产生一个四位值,即取024,{ {1}}位置并将其置于6012位置。

它可以硬编码如下:

3

我想知道是否有更简单,更简单或更优雅的方法。

3 个答案:

答案 0 :(得分:1)

您拥有的代码是您最明确的意图表达,并且最适合任何可能的编译器优化(作为函数,您可以将其声明为constexpr)。你可以通过魔法数字做一些聪明的掩蔽和乘法 - 但我甚至不会得出这些数字,因为不可维护性超过了增益!

答案 1 :(得分:0)

绝对不优雅,并且会扩展到你刚写的内容,但我们可以讨厌模板吗?

template <int pos = 0>
struct altbit{
  static char compute(char a) {
    return ((a & (1 << (2*pos))) >> pos) | altbit<pos+1>::compute(a);
  }
};

template <>
struct altbit<4> {
  static char compute (char a) {
    return 0;
  }
};

用法:altbit<>::compute(a)

答案 2 :(得分:0)

使用std::bitset可以使位操作更加优雅:

#include <iostream>
#include <bitset>

int main()
{
    std::bitset<8> b1(0b11010010);
    std::bitset<4> b2;
    for (int i = 0; i < 4; ++i)
    {
        b2[i] = b1[i*2];
    }
    std::cout << std::hex << "in: " << b1 << ", out: " << b2 << "\n";
}