Re: [問題]位元的1的計算

看板C_and_CPP (C/C++)作者 (gohomexx)時間16年前 (2010/02/24 17:56), 編輯推噓3(300)
留言3則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《markchen ()》之銘言: : int bitcount (unsigned int n) : { : int count = 0 ; : while (n) : { : count++ ; : n &= (n - 1) ; //關鍵演算之處 : } : return count ; : } : 事實上 程式上沒有問題,只是上文中的關鍵之處 : 8 = 1000 : 8 - 1 = 0111 : 這樣可以抓得到該值的二進位只是我不知道該怎麼詮釋這樣的作法 : 以前最為直觀的作法就是使用移位的方式 : 8 = 1000 向左移或向右移,計算有1的總合 : 但是n &= (n - 1) 我不知要怎樣想 提供我的想法供參考, 以位移方式計算時,至少要計算最高位元的次數, 例如 1 0 0 0 0 0 0 0至少要計算8次, 顯然不太聰明.... n & (n-1)的方法, 任何一個二進位數都是 2^n + 2^n-1 +.....+ 1 或是 2^n + 2^n-1 +... + 2 當這個二進位數是奇數時, n & (n-1) 會直接把最尾巴 1 的部份清掉, 所以就可以看成是計算 2^n + 2^n-1 + ... + 2 這個部份共有幾個 bit, 用例子來看 任何一個二進位可以表示成 xxxx 1 0...0 (共n個0) 的型式 xxxx 1 0...0 & xxxx 0 1...1 ( [xxxx 1 0...0] - 1 = [xxxx 0 1...1] ) --------------- xxxx 0 0...0 一下子跳掉 n 個 0, 足足省了 n-1 次計算... xxxx 0 0...0 又可以表示成 xxxx 1 0...0的型式, 再依次計算. 以上,這個演算法的概念大概是這樣. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.220.110.100

02/24 19:10, , 1F
想知道這個通常是直接用硬體實作,還是都用軟體檢查呢?
02/24 19:10, 1F

02/24 22:59, , 2F
太厲害了~~第一次看到這樣的作法
02/24 22:59, 2F

02/25 00:20, , 3F
謝囉,這個小算式的細節含有這些含義
02/25 00:20, 3F
文章代碼(AID): #1BXFVDvA (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1BXFVDvA (C_and_CPP)