1. 程式人生 > >c語言中統計二進位制位中1的個數的演算法優化

c語言中統計二進位制位中1的個數的演算法優化

統計整數二進位制位中1的個數的辦法:

int one(int m)

{

 int count = 0;

 while (m != 0)

 {

  if (m % 2 == 1)   //進行模2除2一位一位的統計

  {

   count++;

  }

  m /= 2;

 }

}
或者下面這種位於運算的
int two(int m)
{
 int count = 0;
 while (m != 0)    
 {
  count += m & 1;    //進行位於運算統計1的個數原理和上面的一樣但是更安全
  m >>= 1;
 }
 return count;
}
  1. 但是這兩種演算法都不能避免的要對二進位制位中的0進行判斷或者計算,又沒有隻與二進位制序列中1有關的演算法呢?

       下面的這種演算法就實現了這樣的想法:

int three(int m)

{

 int count = 0;

 while (m != 0)

 {

  count++;

  m &= m - 1;  //位於本身減1的數可以每次去掉一個1

 }

 return count;

}

當然第三種演算法是最高效的,不過應該還有更為有效的方法。

相關推薦

c語言統計二進位制1個數演算法優化

統計整數二進位制位中1的個數的辦法:int one(int m) {  int count = 0;  while (m != 0)  {   if (m % 2 == 1)   //進行模2除2一位一位的統計   {    count++;   }   m

C語言統計一個字串字母、數字、空格及其它字元的數量

統計一個字串中字母、數字、空格及其它字元的數量 解法1: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> void Count(con

C語言練習題】二進位制模式左右翻轉輸出

《C與指標》5.3題   問題 實現一個函式 reverse_bits 將變數value的二進位制位模式從左到右變換一下後的值返回。 在32位機器上25這個值包含下列各位:  00000000000000000000000000011001 

C語言小結--求一個整數bit1個數

最近開發需要將一個數據做奇偶校驗,首先就是要計算出這個資料中bit位為1的個數,有以下幾種演算法可以達到要求: 1 方法1 我直接上程式碼,然後分析。 uint16_t get_one_in_data_1(uint16_t data) { uint16_t n = 0

C語言實現二叉樹統計葉子結點的個數&度為1&度為2的結點個數

演算法思想 統計二叉樹中葉子結點的個數和度為1、度為2的結點個數,因此可以參照二叉樹三種遍歷演算法(先序、中序、後序)中的任何一種去完成,只需將訪問操作具體變為判斷是否為葉子結點和度為1、度為2的結點及統計操作即可。 #include <stdio.h> #include &

C語言統計數字在排序數組出現的次數

語言 個數 統計 ret r+ () class tdi times //數字在排序數組中出現的次數。 //統計一個數字在排序數組中出現的次數。比如:排序數組{1,2,3,3,3,3,4,5}和數字3,因為3出現了4次,因此輸出4. #include <stdio

C語言 十進位制轉二進位制,並儲存在陣列

#include <stdio.h> #define uint unsigned int #define ushort unsigned short uint transform_data(uint frequence,ushort* pwm_table) { uint temp

C語言:編寫程式數一下 1到 100 的所有整數出現多少次數字9

 編寫程式數一下 1到 100 的所有整數中出現多少次數字9 思路:1到 100 的所有整數中出現多少次數字9,這個問題我們可以看作是兩位整數中個位和十位上總共有多少個9,在兩位數中,一個數整除10餘下的結果是它的個位數,除以10是它的十位數,把個位數和十位數上有9的次數算出來就可以了

統計二進位制1個數

思路:定義n表示1的個數,一個二進位制數按位遍歷一遍,並且每一位按位與1,結果為1,則n加1,輸出n即為結果。 程式碼: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.

求一個數二進位制有多少個 1 的不同解法

*返回一個數的二進位制表達中1的個數。*#include<stdio.h>int main(){    unsigned int i;    scanf("%d",&i);    p

計算1個數--計算一個整數二進位制1個數。要求效率儘可能的高。且能正確求正數和負數的二進位制1個數

錯誤方法: 數字右移,這裡會涉及到移位的規則。 移位規則: 左移運算子m<<表示把m左移n位。左移n位的時候,最左邊的n位將被丟棄,同時在右邊補上n個0; 右移比左移稍微複雜一些,如果數字是一個無符號值或正數,右移時最左邊補0; 如果數字是

C語言統計隨機數數字出現個數,並列印直方圖

實現功能:生成二十個隨機數。統計二十個數中,0-9數字出現的次數,並列印成直方圖 #include<stdio.h> #include<stdlib.h> #define N 20 int a[N],b[10]; void gen_rand

統計二進位制展開數位1個數優化

問題:   對於任意的非負整數,統計其二進位制展開中數位1的總數。 解決:   在看這篇之前可以先看看上述這篇,這篇主要討論其優化問題。 常規解法: O(logn): 1 int countOnes(unsigned int n) 2 { 3 int

C語言統計陣列出現次數超過一半的數字

//統計陣列中出現次數超過一半的數字 #include <stdio.h> int Find(int *arr, int len) { int num = 0; //當

計算一個數二進位制1個數的方法總結

方法一、通過移位分別判斷各個位 int bit_count(unsigned int n) { int count; for(count=0;n;n>>=1) { count+=n&1; } return c

c語言整數轉二進位制顯示及統計1個數

#include "stdio.h" #include "stdlib.h" #include "string.h" int main(void){ int in_int; printf

C語言在linux內核do while(0)妙用之法

pos turn jsb world div fprintf cpp efault code 為什麽說do while(0) 妙?由於它的確就是妙,並且在linux內核中實現是相當的妙,我們來看看內核中的相關代碼: #define db_error(fmt, ..

Linux系統下C語言如何調用scalapack的函數

lap inux *** col ocs ack cnblogs scala nal 在並行計算中經常需要調用scalapck(並行化的lapack)函數庫裏面的函數進行編程,這裏簡單介紹在C語言如何調用scalapck中的矩陣向量乘的函數。 註意:scalapack中的函

C語言結構體在內存的存儲情況探究------內存對齊

.com ret size \n str 技術 urn 存儲 typedef 條件(先看一下各個基本類型都占幾個字節): void size_(){ printf("char類型:%d\n", sizeof(char)); printf("in