簡體   English   中英

將整數的X位設置為另一個整數的Y位而不分支嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM