2つの変数をマージする必要があります。どちらも署名されていないintです。
- 最初:11000000
- 2番目:11111010000
必要な出力:11011111010000
つまり、2番目の数字全体の前に、すべての1の後に1つの0(最初の数字)を置く必要があります。私の頭に浮かぶ唯一の考えは、最初の数字を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ビット以外のマシンでは微調整が必要であることに注意してください。
末尾の0がない一連の1ができるまで、最初のビットを右にシフトします。次に、2番目のプラス1の「長さ」(実際には最初の1以降のビット数)を左にビットシフトします。次に、それらを一緒に、合計しないでください。そうしないと、バグが発生する可能性があります。
整数が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