2016-10-12 5 views
0

この質問は、と性質が似ています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); 
} 

でしょうか?

答えて

0

これはもっと簡単です(ビットパターンのn回の繰り返しで整数を埋めたい)。

unsigned int bitRepeat(unsigned int x, int n) 
{ 
    unsigned int answer = 0; 

    while(x) 
    { 
    answer |= x; 
    x <<= n; 
    } 

    return answer; 
} 

符号付き整数のMSBをシフトアウトすると予測できない結果になる可能性があるため、符号なし整数を使用する必要があります。 (コンパイラは をx * = poweroftwoに最適化し、算術オーバーフロートラップを設定する可能性があるため)。

ループを使用できないため、少し難しくなります。 のように、整数が32ビットの場合、最悪の場合、 バッファを5回倍にします。

シフトが整数のサイズを超える になった場合ので

int bitRepeat(int x, int n) 
{ 
    unsigned int rack = x; 

    rack = (rack << n) | rack; 
    n *= 2; 
    rack = (rack << n) | rack; 
    n *= 2; 
    rack = (rack << n) | rack; 
    n *= 2; 
    rack = (rack << n) | rack; 
    n *= 2; 
    rack = (rack << n) | rack; 

    return rack; 
} 

残念ながら、これは技術的に未定義の動作です。あなたのコンパイラがそれを受け入れるかもしれません。しかし条件付きで抑制するのは難しいです。

+0

ありがとうございます。残念ながら、私は 'int bitRepeat(int x、int n)'を変更することはできませんまたはループ/条件を使用します。 'unsigned'コンテナに' x'を格納するのは助けになりますか? – sgoldburg

関連する問題