以下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
回答问题。
答案 0 :(得分:9)
你可以这样做:
//Change the bit if and only if they are not equal:
out ^= (((out >> out_bit) ^ (in >> in_bit)) & 1) << out_bit;
(移动两个值,使得所需的位在&gt;&gt;的最低位置,用&amp;只选择^操作结果的低位;然后将结果移动到否则为零的位置-value到^与原始目的地。结果与复制bit in_bit in-bit out_bit out相同。)
答案 1 :(得分:6)
在一行中执行此操作的一种方法是首先将输出位重置为零,然后将其与in
数字的任何位进行OR运算:
(out &= ~(1 << out_bit)) |= (((in >> in_bit) & 1) << out_bit)
答案 2 :(得分:4)
试试这个:
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)
将该位置于正确的位置。