例如,
unsigned char a = 0b11010010;
我想为每个其他位设置a
的子集并将它们放在一起以产生一个四位值,即取0
,2
,4
,{ {1}}位置并将其置于6
,0
,1
,2
位置。
它可以硬编码如下:
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";
}