日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[剑指Offer]12.二进制中1的个数

發(fā)布時(shí)間:2025/6/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [剑指Offer]12.二进制中1的个数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目

輸入一個(gè)整數(shù),輸出該數(shù)二進(jìn)制表示中1的個(gè)數(shù)。其中負(fù)數(shù)用補(bǔ)碼表示。

思路

把一個(gè)整數(shù)減去1,再和原整數(shù)做與運(yùn)算,會(huì)把整數(shù)最右邊一個(gè)1變成0.那么一個(gè)整數(shù)的二進(jìn)制表示中有多少個(gè)1,就可以進(jìn)行多次這樣的操作。

代碼

/*--------------------------------------- * 日期:2015-07-20 * 作者:SJF0115 * 題目: 12.二進(jìn)制中1的個(gè)數(shù) * 結(jié)果:AC * 網(wǎng)址:http://www.nowcoder.com/books/coding-interviews/8ee967e43c2c4ec193b040ea7fbb10b8?rp=1 * 來(lái)源:劍指Offer * 博客: -----------------------------------------*/ #include <iostream> #include <vector> #include <string> #include <stack> #include <algorithm> using namespace std;class Solution { public:int NumberOf1(int n){int count = 0;while(n){n &= (n-1);++count;}//whilereturn count;} };int main(){Solution s;int n;while(cin>>n){int result = s.NumberOf1(n);// 輸出cout<<result<<endl;}//whilereturn 0; }

思路二

我們可能很快就有一個(gè)思路:先判斷整數(shù)二進(jìn)制表示中最右邊一位是不是1.接著把輸入的整數(shù)右移一位,此時(shí)原來(lái)處于從右邊數(shù)起第二位被移到最右邊了,再判斷是不是1。這樣每次移動(dòng)一位,直到整個(gè)整數(shù)變成0為止。基于這個(gè)思路我們寫(xiě)完下面的程序。但是當(dāng)我們輸入一個(gè)負(fù)數(shù)時(shí),這個(gè)方法就會(huì)出現(xiàn)問(wèn)題。比如0x80000000,把負(fù)數(shù)0x80000000右移一位時(shí)并不是簡(jiǎn)單的把最高位的1移到第二位變成0x40000000,而是0xC0000000。這是因?yàn)橐莆磺笆莻€(gè)負(fù)數(shù),仍然要保證移位后是個(gè)負(fù)數(shù),因此移位后最高位仍然是1。如果一直做右移運(yùn)算,最終這個(gè)數(shù)字就會(huì)變成0xFFFFFFFF而陷入死循環(huán)

代碼二

class Solution { public:int NumberOf1(int n){int count = 0;while(n){if(n & 1){++count;}//ifn = n >> 1;}//whilereturn count;} };

思路三

為了避免死循環(huán),我們可以不右移輸入的數(shù)字n。首先把n和1做與運(yùn)算,判斷n的最低位是不是為1。接著把1左移一位得到2,再和n做與運(yùn)算,就能判斷n的次低位是不是1…….這樣反復(fù)左移,每次都能判斷n的其中一位是不是1。

代碼三

/*--------------------------------------- * 日期:2015-07-20 * 作者:SJF0115 * 題目: 12.二進(jìn)制中1的個(gè)數(shù) * 結(jié)果:AC * 網(wǎng)址:http://www.nowcoder.com/books/coding-interviews/8ee967e43c2c4ec193b040ea7fbb10b8?rp=1 * 來(lái)源:劍指Offer * 博客: -----------------------------------------*/ #include <iostream> #include <vector> #include <string> #include <stack> #include <algorithm> using namespace std;class Solution { public:int NumberOf1(int n){int count = 0;int base = 1;while(base){if(n & base){++count;}//ifbase = base << 1;}//whilereturn count;} };int main(){Solution s;int n;while(cin>>n){int result = s.NumberOf1(n);// 輸出cout<<result<<endl;}//whilereturn 0; }

總結(jié)

以上是生活随笔為你收集整理的[剑指Offer]12.二进制中1的个数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。