変数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
でなければなりません。
'msb'がゼロのときにあなたのコードが何もしていないように見え、' nx-1'の位置のビットがゼロのときに 'msb'がゼロに設定されています。これは意図的なものではありませんか? – dasblinkenlight
実際には意図的です(私は "未使用部分"がすでに0に設定されていると仮定しています)。私たちは私が "if文"だけを必要とすると仮定しますが、私は推測します。 if(msb){x | = leading_ones} else {x&= leading zeroes}または私は重要ではない部分をマスクします(まだと操作)。 – user8469759
@dasblinkenlight元の質問には例があります。 – user8469759