7

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 );

更新:明確にするために、これは宿題や提案std::bitsetが質問に答える XY 問題ではありません。

4

3 に答える 3

9

あなたはこのようにそれを行うことができます:

//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 にコピーするのと同じです。)

于 2014-08-11T05:39:27.040 に答える
6

in1行でこれを行う1つの方法は、最初に出力ビットをゼロにリセットしてから、数値が持つビットとORすることです。

(out &= ~(1 << out_bit)) |= (((in >> in_bit) & 1) << out_bit)
于 2014-08-11T05:45:33.377 に答える
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)ビットを正しい位置に配置します。
于 2014-08-11T05:44:08.803 に答える