3

2つの変数をマージする必要があります。どちらも署名されていないintです。

  • 最初:11000000
  • 2番目:11111010000

必要な出力:11011111010000

つまり、2番目の数字全体の前に、すべての1の後に1つの0(最初の数字)を置く必要があります。私の頭に浮かぶ唯一の考えは、最初の数字を2番目の数字の長さと同じ数だけ左にビットシフトすることです。そしてそれを合計するよりも。でも長さはわかりません。おそらく見つかるかもしれませんが、もっと簡単な方法はありませんか?

どうも

4

3 に答える 3

2

一定時間で実行されるソリューションは次のとおりです。

xの最初の1ビットの位置は(int)(log(x)/ log(2))で計算できます。

さらに、ここに示す巧妙なトリックによって、xの後続ゼロの数を計算できます:http://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightMultLookup

したがって、プログラムは次のようになります。

int x, y;
int lookuptable[32] = { 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25,
                        17, 4, 8, 31, 27, 13, 23, 21, 19, 16, 7, 26, 
                        12, 18, 6, 11, 5, 10, 9 };

int tail_x = lookuptable[(((x & -x) * 0x077CB531U)) >> 27];
int size_y = (int)(log(y) / log(2)) + 1;

if (tail_x - size_y <= 0) {
        x <<= size_y - tail_x + 1;
} else {
        x >>= tail_x - size_y - 1;
}       

x |= y;

ここで、xには、OPで指定されたxにyを追加した結果が含まれます。32ビット以外のマシンでは微調整が必​​要であることに注意してください。

于 2011-03-20T14:32:51.167 に答える
1

末尾の0がない一連の1ができるまで、最初のビットを右にシフトします。次に、2番目のプラス1の「長さ」(実際には最初の1以降のビット数)を左にビットシフトします。次に、それらを一緒に、合計しないでください。そうしないと、バグが発生する可能性があります。

于 2011-03-20T14:22:17.693 に答える
0

整数が2の累乗であるかどうかの判断

unsigned int v; //vが2の累乗であるかどうかを確認したいboolf; //結果はここに表示されます

f =(v&(v --1))== 0; ここでは、0は誤って2の累乗と見なされることに注意してください。これを修正するには、次を使用します。f = v &&!(v&(v-1));

したがって、vが2の累乗より1小さいかどうかを確認するには、vに1を加算します(v + 1)&v)== 0

(コピー+1)&コピー)!= 0

したがって、Jonの答えを使用し、copy!= 0を(copy + 1)&copy)!= 0に置き換えると、最後に一連の1が付いたintが存在するまでトリミングされます。copyのスコープはforループの範囲外である必要があり、結果は(copy <<(cBitsFirst + 1))|になります。2番目;

unsigned int first, second; // initialize these somehow
unsigned int result = 0;
int cBitsFirst = 0;
unsigned int copy;
for (copy; (copy + 1) & copy) != 0; copy >>= 1) {//stop when there is series of 0's followed by a series of 1's
    ++cBitsFirst;
}

result = (copy << (log2(second)+1) | second;//the plus one gives the 0 back
于 2011-03-20T14:55:41.877 に答える