簡體   English   中英

位操作(從X中提取第5位並在X中返回1位數)

[英]Bit Manipulation (extract 5th bit from X and return number of 1 bits in X)

假設X是無符號整數,我將如何從X中提取第5位並返回X中的1位數。注意:這兩個操作不相互依賴。

為了從XI中提取第5位,我想使用&operation來做這樣的事情:XXXX1X&000010

我不確定如何在X中返回1位的數量。

謝謝!

計數1位數是相對簡單的; 迭代你的數字的所有位並向一些累加器添加設置的位數:

unsigned int X;     
unsigned int count; 

for (count = 0; X; X >>= 1) {
   count += X & 1;
}

這個怎么運作:

  1. 將計數初始化為0
  2. 從MSB開始(最高位)[這是當前位]
  3. 添加以計算當前位&1的結果
    • 如果該位置位,則為1
    • 如果未設置該位,則為0
  4. 將X向右移1位,因此當前位現在是下一個MSB
  5. 重復步驟3

提取第5位也很簡單,只需將數字X右移5並用1計算邏輯AND:

unsigned int fifthBit (unsigned int X) {
   return (X >> 5) & 1;
}

int查找設置位數的更簡單和更簡單的方法如下:

int num_1_bits(unsigned int x)  // or unsigned long x; or unsigned short x;
{
   int bitcount = 0;
   while(x)
   { 
      x &= (x - 1);
      ++bitcount;
   }
   return bitcount;
}

這是如何運作的?

對於一個無符號數x ,比特在序列x - 1將成為補體x ,直到所述第一組位x從LSB計數。

x = 20 [0b11100] ; x - 1 = 19 [0b11011]
這里的位序列19是補體20直到第一組位20 (第一組位位置3處從LSB)。

因此,
如果你執行x & (x - 1) ,此操作將消耗x一個設置位。

因此,
如果你想繼續這樣做直到x變為0 ,你需要做多次,因為x有設置位,這反過來會給你x中設置位的計數。

這種方法更好,因為循環的運行次數與x中的1位一樣多,因此不依賴於x數據類型。

作為補充,我精確,如果你正在尋找的效率,也有一些內置的硬件指令來執行對位計算(數零:你可以推斷出多少個1-bit ,你有那么)看到此文章作為例子。

暫無
暫無

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

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