簡體   English   中英

連接兩位模式

[英]Concatenating two bit patterns

我需要合並兩個變量。 它們都是無符號的整數。

  • 第一名:11000000
  • 第二名:11111010000

期望的輸出:11011111010000

用語言:我需要將所有1后跟一個0(在第一個數字中)放在整個第二個數字的前面。 我想到的唯一想法是,將第一個數字向左移位與第二個數字的長度一樣多。 而不是總結它。 但我不知道長度。 雖然可能找到它,但是沒有更好的方法嗎?

謝謝

這是一個在恆定時間內運行的解決方案:

您可以通過(int)(log(x)/ log(2))計算x的第一個1位的位置。

此外,您可以通過這里顯示的巧妙技巧計算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沒有尾隨0.然后將它移位到左邊的第二個加1的“長度”(實際上是第一個1之后的位數)和然后或他們在一起,不要求和否則可能會出現錯誤。

確定整數是否為2的冪

unsigned int v; //我們想知道v是2 bool f的冪; //結果就在這里

f =(v&(v - 1))== 0; 請注意,此處0被錯誤地視為2的冪。 要解決此問題,請使用:f = v &&!(v&(v - 1));

因此,要查看v是否小於2的冪,我們將一個加到v(v + 1)&v)== 0

(復制+ 1)和復制)!= 0

所以使用Jon的答案並用副本替換副本!= 0(復制+ 1)和復制)!= 0將修剪,直到最后一個帶有一系列1的int。 copy的范圍需要在for循環之外,結果將是(copy <<(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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM