この質問は、と性質が似ています32bit int。最適化ブールマスク割り当て
私のコードはvalue & ~(!(x & y) - 1)
です。 xとyのビットの間に重なりがある場合、valueは0に設定されます。そうでない場合、valueはそのままになります。
私の質問は、関係する演算子の数を減らすためにこのステートメントを最適化する方法です。これは単項演算と2進整数演算を使用して可能ですか! ~ &^| + - */% << >>
?ここで
は、いくつかの参照のために私のコードですが、それはワード長に下位nはxのビットを繰り返し:いくつかの能力の助けにunsigned
データを実装
int bitRepeat(int x, int n) {
/* Mask desired bits, shift and OR by larger intervals each time, return repeated pattern */
/* Check for n = 32, set a to all 1's if n != 32 */
int nMax = ~(!(n & 31)-1);
/* Mask low-order n bits */
int maskBits = ~(~0 << n) & x;
/* Initialize shift factors */
int n2 = n * 2;
int n4 = n * 4;
int n8 = n * 8;
int n16 = n * 16;
/* Shift and OR masked bits by intervals n * x {x: 1,2,4,8,16}, check for overflow at each step */
int overFlowMask = ~0 << 5;
maskBits = maskBits | maskBits << n;
maskBits = maskBits | ((maskBits << (n2)) & ~(!((n2) & overFlowMask) - 1));
maskBits = maskBits | ((maskBits << (n4)) & ~(!((n4) & overFlowMask) - 1));
maskBits = maskBits | ((maskBits << (n8)) & ~(!((n8) & overFlowMask) - 1));
maskBits = maskBits | ((maskBits << (n16)) & ~(!((n16) & overFlowMask) - 1));
return (maskBits & ~nMax) | (x & nMax);
}
でしょうか?
ありがとうございます。残念ながら、私は 'int bitRepeat(int x、int n)'を変更することはできませんまたはループ/条件を使用します。 'unsigned'コンテナに' x'を格納するのは助けになりますか? – sgoldburg