![](/img/trans.png)
[英]How to use bit manipulation to find 5th bit, and to return number of 1 bits in an integer
[英]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;
}
這個怎么運作:
提取第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.