[英]Set bit X of an integer to bit Y of another integer without branching?
可以將下面的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_bit of in的位復制到out_bit of out的位相同。)
在一行中執行此操作的一種方法是,首先將輸出位重置為零,然后將其與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)
將位定位在正確的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.