下面的copy_bit
函数可以简化为类似out[out_bit] = in[in_bit]
的东西吗?(即不使用if
语句)
template< typename T >
inline void copy_bit( T& out, const T in, const std::size_t out_bit, const std::size_t in_bit )
{
if ( (in & (1 << in_bit)) != 0 )
{
out |= (1 << out_bit); // Set bit
}
else
{
out &= ~(1 << out_bit); // Clear bit
}
}
// Set bit 4 in x to bit 11 in y
copy_bit( x, y, 4, 11 );
更新:只是为了清楚,这不是家庭作业或XY问题,建议std::bitset
回答问题。
你可以这样做:
//Change the bit if and only if they are not equal:
out ^= (((out >> out_bit) ^ (in >> in_bit)) & 1) << out_bit;
(用>>移动两个值,使所需的位位于最低有效位,用&只有^运算结果的低位;然后将结果移动到一个不为零的值的位置到^与原始目标。结果与将in的in_bit位复制到out的out_bit位相同。)
在一行中这样做的一种方法是首先将输出位重置为零,然后将其与in
数字的任何位进行OR:
(out &= ~(1 << out_bit)) |= (((in >> in_bit) & 1) << out_bit)
试试这个:
template< typename T >
inline void copy_bit( T& out, const T in, const std::size_t out_bit, const std::size_t in_bit )
{
out = (out & ~(1 << out_bit)) | (((in & (1 << in_bit)) >> in_bit) << out_bit);
}
解释:
-
(out & ~(1 << out_bit))
留下out
中不感兴趣的位。 -
(in & (1 << in_bit)
选择in
中感兴趣的位 -
(((in & (1 << in_bit)) >> in_bit) << out_bit)
将位定位到正确位置。