簡體   English   中英

如何使用位操作找到第5位,並以整數形式返回1位的數目

[英]How to use bit manipulation to find 5th bit, and to return number of 1 bits in an integer

假設Z是一個無符號整數。 使用〜,<<,>>,&,| ,+和-提供返回所需結果的語句。

如果需要,我可以引入新的二進制值。

我有這些問題:

1. 從左 Z提取第5位。

為此,我正在考慮做類似的事情

  x x x x x x x x 
& 0 0 0 0 1 0 0 0 
___________________

  0 0 0 0 1 0 0 0 

這對於提取第五位有意義嗎? 我不確定在不知道Z值的情況下如何僅使用Z來完成這項工作。 (我對所有這些都比較陌生)。 這種想法會起作用嗎?

2.返回Z中的1位數

Here I kind of have no idea how to work this out. What I really need to know is how to work on just Z with the operators, but I m not sure exactly how to. 

就像我說的那樣,我是新手,所以能提供任何幫助。

問題1

你是對的錢。 我將使用&>>以便得到0或1。

result = (z & 0x08) >> 3;

但是,這可能不是嚴格必要的。 例如,如果您嘗試檢查該位是否設置為if條件的一部分, if可以利用C對非零值的定義為true。

if (z & 0x08)
        do_stuff();

問題2

有很多種方法可以做到這一點。 根據該頁面,以下方法可追溯到1960年,盡管直到1988年才在C語言中發布。

for (result = 0; z; result++)
        z &= z - 1;

確切的原因一開始可能並不很明顯,但是如果您通過一些示例進行操作,您將很快知道它為什么起作用。

值得注意的是,此操作(確定一個數字中的1位的數目)對於擁有名稱(人口計數或漢明權重 )非常重要,並且在最近的Intel和AMD處理器上還具有專用指令 如果您使用的是GCC,則可以使用__builtin_popcount內部函數。

問題1看起來正確,但是您應該通過將結果右移4來獲得該掩碼后的位來完成它。

要實現掩碼,您需要知道單個5位代表什么整數。 該數字是2 ^ 5 =32。因此,您可以將z與32進行“與”運算並將其右移4。

問題2:

int answer = 0;
while (z != 0){  //stop when there are no more 1 bits in z

   //the following masks the lowest bit in z and adds it into answer
   //if z ends with a 0, nothing is added, otherwise 1 is added
   answer += (z & 1);
   //this shifts z right by 1 to get the next higher bit
   z >>= 1;
}
return answer;

要找出第五位的值,您無需關心最低位,因此可以擺脫它們:

unsigned int answer = z >> 4;

第五位變為最低位,因此您可以使用按位與運算符將其剝離:

answer = answer & 1;

要查找數字中的1位數字,您可以應用stakSmashr的解決方案。 如果您知道需要計算許多整數中的位數,則可以進一步優化此方法-預計算每個可能的8位數字中的位數,並將其存儲在表中。 該表中只有256個條目,因此不會占用太多內存。 然后,您可以一次循環一個字節的數據,並從表中找到答案。 這種查找比重新遍歷每個位更快。

暫無
暫無

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

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