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; }
- 但是這兩種演算法都不能避免的要對二進位制位中的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語言小結--求一個整數中bit位為1的個數
最近開發需要將一個數據做奇偶校驗,首先就是要計算出這個資料中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; 如果數字是
計算一個整數二進位制位中1的個數。要求效率儘可能的高。且能正確求正數和負數的二進位制中1的個數。
#include<iostream> #include<stdlib.h> using namespace std; int Number1(int n) { int
【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