問題:計算某個數(shù)的二進制中1的個數(shù)
創(chuàng)新互聯(lián)公司是專業(yè)的龍灣網(wǎng)站建設(shè)公司,龍灣接單;提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行龍灣網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!思路:x = x & (x-1) 將 x 的二進制最右面的一個 1 變?yōu)?0,其余保持不變。反復(fù)操作,直到變?yōu)?0 為止,計算操作次數(shù),即為 x 的二進制中 1 的個數(shù)。
證明:假設(shè) x 的二進制末尾為 10...0 [末尾有 k 個 0,k = 0,1,2,...]。
則 x - 1 的二進制末尾 k+1 位為 01...1 [末尾有 k 個 1,k = 0,1,2,...],其他與 x 相同。
從而 x & (x-1) 的末尾 k+1 位為 00...0 [末尾有 k+1 個 0,k = 0,1,2,...],其他與 x 相同。
即 x = x & (x-1) 將 x 的最右邊的一個 1 變?yōu)?0,其余位數(shù)無變化。
C++程序:
#includeusing namespace std; int manyOne(int x){ int countx = 0; while(x){ ++countx; x = x&(x-1); } return countx; } int main(){ cout< 類似問題:x = x | (x+1) 將 x 的二進制最右面的一個 0 變?yōu)?1,其余保持不變。
證明:假設(shè) x 的二進制末尾為 01...1 [末尾有 k 個 1,k = 0,1,2,...]。
則 x + 1 的二進制末尾 k+1 位為 10...0 [末尾有 k 個 0,k = 0,1,2,...],其他與 x 相同。
從而 x | (x+1) 的末尾 k+1 位為 11...1 [末尾有 k+1 個 1,k = 0,1,2,...],其他與 x 相同。
即 x = x | (x+1) 將 x 的最右邊的一個 0 變?yōu)?1,其余位數(shù)無變化。
應(yīng)用:判斷一個整數(shù) x 是否為 2 的冪。
思路:假如 x 為 2 的冪,則 x 只有最高位為 1,其余均為 0,因此按照上面的做法 x = x & (x-1) 將會為 0;反之,假如 x = x & (x-1) 為 0,則 x 只有一位為 1,其余均為 0,顯然 x 為 2 的冪。
C++程序:
#includeusing namespace std; int isTwoPow(int x){ if( (x&(x-1)) == 0) return 1; else return 0; } int main(){ cout< 另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
分享題目:計算二進制中1的個數(shù)-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://weahome.cn/article/cdhijh.html