求二進位中1的個數

來源:互聯網
上載者:User

題目來源於《編程之美》這本書。

本文為讀書筆記。

 

題目看起來比較簡單,可是編程之美卻將這道題的解法描述道極致。

對於一個32位整數N,求其二進位表示中的1的總數。

 

思路:

對於任一個位元,必有形式abcd1000……,abcd為1或者0,我們姑且認為最後面有四個0.

我們這樣考慮這個數:abcd1000,我們首先去掉最後一個1,讓該數字與比該數字小於1的那個整數與操作。

(abcd1000)&(abcd1000-1)

=(abcd1000)&(abcd0111)

=abcd0000

 

如此一來我們就消除了最後一個1,二前面的abcd則不受任何影響。

於是此時又會暴露出最有一個1,用同樣的方法消除之,知道整數的值為0。

 

於是代碼就出來了:

 

INT32 Fun(INT32 nNumber)</p><p>{</p><p>INT32 nCount = 0;</p><p>while(nNumber)</p><p>{</p><p>++nCount;</p><p>nNumber = nNumber&(nNumber-1);</p><p>}</p><p>return nCount;</p><p>}<br />

 

關於擴充問題:

 

對於給定的正整數A和B,為了把A變為B,需要改變A中的多少位元。

這個問題讓我想到了異或運算,其規則如下:

1^0=1

0^1=1

0^0=0

1^1=0

為了知道需要改變的位元總數,

我們需要知道A和B之間不同的位元計數或者相同的位元計數。

異或運算能夠讓A和B不同的位元變為1,相同的位元變為0,

我們只需要對結果求解1的總位元,就可以搞定問題了。

 

例如:

A=8D=0000 1000B

B=7D=0000 0111B

為了把A變為B,需要改變4位元字。

A和B異或運算的結果是0000 1111 = 0x0F,

其中1的總書目為4,

即問題的答案。

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.