2016-06-23 16 views
1

変数xが64ビットであるとします。実際に使用する変数のビット数は、たとえば1 <= nx <= 64なので、最後のビットはnx - 1です。残っているビットの最後のビットのパディングを実行する最速の方法は何でしょうか64 - nx可変埋め込みC

uint64_t padd_input(uint64_t x, int nx) { 
    assert(0 < nx && nx <= 64); 
    msb = (x & (1ULL<<(nx - 1))) != 0ULL; //or (x >> (nx - 1)) & 0x1ULL; 
    x |= ((msb<<(64 - nx)) - msb)<<nx; 
    return x; 
} 

が冗長マスク/すべてのシフトである:

私は(擬似コード/ C)のような何かをしようとするだろうか?それとも同じことを達成するよりスマートな方法がありますか?

私が達成したいの例を作り、のは私が行うには何もない、この場合に0x7、およびnx = 4を持っているとしましょう、未使用の部分はすでに0

に設定されていると仮定します。代わりに0xFと仮定すると、パディングは0xFFFFFFFFFFFFFFFFでなければなりません。

+1

'msb'がゼロのときにあなたのコードが何もしていないように見え、' nx-1'の位置のビットがゼロのときに 'msb'がゼロに設定されています。これは意図的なものではありませんか? – dasblinkenlight

+0

実際には意図的です(私は "未使用部分"がすでに0に設定されていると仮定しています)。私たちは私が "if文"だけを必要とすると仮定しますが、私は推測します。 if(msb){x | = leading_ones} else {x&= leading zeroes}または私は重要ではない部分をマスクします(まだと操作)。 – user8469759

+1

@dasblinkenlight元の質問には例があります。 – user8469759

答えて

1

私はどうなる:

uint64_t padd_input(uint64_t x, int nx) 
{ 
    uint64_t t = x & (1ULL << (nx-1)); 
    t = t - 1; 
    x = x | ~t; 
    return x; 
} 

または多分

uint64_t padd_input(uint64_t x, int nx) 
{ 
    uint64_t t = x & (1ULL << (nx-1)); 
    if (t) 
    { 
     t = t - 1; 
     x = x | ~t; 
    } 
    return x; 
} 

それは私には、より明確なようだと。

注:私はOPコードと私のコードのパフォーマンスを比較していません。

+0

最初のものは興味深いようです。 – user8469759

+0

@ user8469759 - 結果は両方とも同じです。それは、あなたが 'if'を望んでいるのか、常に' t = t - 1をやりたいのかという疑問です。 x = x | 〜t; '、すなわち' t == 0 'の場合、それらの2つの行は 'x'を変更しません。 – 4386427

+0

他の人が他の回答を追加するのを待つ。しかし、あなたのものは、最初は非常にきれいです。 – user8469759