我需要合并两个变量。它们都是无符号的整数。
期望的输出: 11011111010000
用语言:我需要将所有1后跟一个0(在第一个数字中)放在整个第二个数字的前面。我想到的唯一想法是,将第一个数字向左移位与第二个数字的长度一样多。而不是总结它。但我不知道长度。虽然可能找到它,但是没有更好的方法吗?
THX
答案 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的结果。请注意,您需要对非32位计算机进行轻微调整。
答案 1 :(得分:1)
将第一个向右移位,直到你有一系列的1,没有尾随0。 然后将它向左移位为第二个加1的“长度”(实际上是第一个1之后的位数) 然后将它们组合在一起,不要求和,否则就会出现错误。
答案 2 :(得分:0)
确定整数是否是2的幂
unsigned int v; //我们想知道v是2的幂 bool f; //结果在这里
f =(v&amp;(v - 1))== 0; 请注意,此处0被错误地视为2的幂。要解决这个问题,请使用: f = v&amp;&amp; !(v&amp;(v - 1));
因此,要查看v是否小于2的幂,我们将一个加到v (v + 1)&amp; v)== 0
(复制+ 1)&amp;复制)!= 0
所以使用Jon的答案并用副本替换副本!= 0(copy + 1)&amp;复制)!= 0 将修剪直到最后一系列1的int。 copy的范围需要在for循环之外, 结果将是(copy&lt;&lt;(cBitsFirst + 1))|第二;
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