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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C/C++求一个整数的二进制中1的个数(用三种效率不同的方法实现)

發布時間:2024/7/23 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++求一个整数的二进制中1的个数(用三种效率不同的方法实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:

實現一個函數,輸入一個整數,輸出該數二進制中1的個數。例如把9表示成二進制是1001,有2位是1,因此如果輸入是9,該函數輸出2

第一種解法(死循環)

  • 判斷整數二進制表示中最右邊的一位是不是1
  • 將二進制數右移一位1
  • 直到整個整數變成0為止
  • 代碼如下:

    int NumberOf1(int n) { int count = 0; while(n){ if(n & 1) count++; n = n >> 1; } return count;}

    這樣很容易造成死循環,如果輸入是一個負數,將負數想右移一位的時候,并不是簡單的將最高位1移到第二位,而是移位后最高位任然回事1,因為右移前是一個負數,右移后仍要保持是負數,一直持續下去數字就會變成0xFFFFFFFF而陷入死循環

    第二種解法(常規)

    為了避免死循環,可以不移動輸入的數字,移動一個無符號的變量1

  • 定義一個無符號的臨時變量tmp = 1
  • 將輸入的數字與tmp做位與運算,判斷最低位是不是1
  • 將tmp左移一位,再次將輸入的數字與tmp做位與運算,判斷次低位是不是1
  • 將tmp一直左移,直到最高位
  • 代碼如下:

    int NumberOf1(int n){int count = 0;unsigned int tmp = 1;while (tmp){if (n & tmp){count++;}tmp = tmp << 1;}return count;}

    這樣效率相對低一些,因為這個循環次數等于整數二進制的位數,32位的整數就需要循環32次,浪費不必要的時間

    第三種解法(將以上優缺點進行了融合)

    為了提高代碼的效率,可以將整數減1在與之前的原整數進行位與運算

  • 將輸入的整數減1再與原整數進行位與運算
  • 將運算結果賦給輸入的整數
  • 一直循環1、2,直到這個整數為零
  • 代碼如下:

    int NumberOf2(int n){ int count = 0;while (n){n = n&(n - 1);count++;}return count;}

    這種解法可以有效的避免死循環和效率低,例如1101,具體實現過程如下


    注:1、不能用除法來代替移位,因為除法的效率比移位運算要低得多,應該多用移位來代替除法

    總結

    以上是生活随笔為你收集整理的C/C++求一个整数的二进制中1的个数(用三种效率不同的方法实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。