下面的
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
数字具有的任何位进行或:
(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)
将钻头定位在正确的位置。