計算一個無符整數中bit位為1的個數
1.迴圈法(Iterated Count)
int bitcount (unsigned int n)
{
int count=0;
while (n) {
count += n & 0x1u ;
n >>= 1 ;
}
return count ;
}
最容易理解和想到的方法。對每一位依次判斷是否為1,如果是就在count上加1。
迴圈的次數是常數(n的位數)。在1比較稀疏的時候效率低,可用方法2改進。
2.Bit1稀疏Sparse Ones
int bitcount (unsigned int n)
{
int count=0 ;
while (n) {
count++ ;
n &= (n - 1) ;
}
return count ;
}
理解這個演算法的核心,只需理解2個操作:
1> 當一個數被減1時,他最右邊的那個值為1的Bit將變為0,同時其右邊的所有的Bit都會變成1。2>“&=”,位與並賦值操作。去掉已經被計數過的1,並將改值重新設定給n.
這個演算法迴圈的次數是bit位為一的個數。也就說有幾個Bit為1,迴圈幾次。對Bit為1比較稀疏的數來說,效能很好。如:0x1000 0000, 迴圈一次就可以。
相關推薦
計算一個無符整數中bit位為1的個數
1.迴圈法(Iterated Count) int bitcount (unsigned int n) { int count=0; while (n) { count += n & 0x1u ; n >>= 1 ; } return count ;
C語言小結--求一個整數中bit位為1的個數
最近開發需要將一個數據做奇偶校驗,首先就是要計算出這個資料中bit位為1的個數,有以下幾種演算法可以達到要求: 1 方法1 我直接上程式碼,然後分析。 uint16_t get_one_in_data_1(uint16_t data) { uint16_t n = 0
計算一個無符號整數的二進位制中0和1的個數
x=x|(x+1) 的作用是每次迴圈把x的二進位制中從右往左數的最後一位0變成1,直道變成全1的時候x+1就溢位為全0,迴圈結束。 x=x&(x-1) 的作用是
給40億個不重複的無符號整數,沒排過序。給一個無符號整數,如何快速判斷一個數是否在這40億個數中。 【騰訊】
40億佔多少個位元組:4G 10個億需要1G 一個整型需要4個位元組,40億個則需要16G 由於如果我們直接使用這種方式去儲存需要16個G顯然這是不可能的,因此我們需要用到下面的方式去儲存,採用點陣圖 我們用一個Bit位去標識一個數存在還是不存在 我們
雜湊變形—點陣圖(給定40億個不重複的無符號數整數,沒排過序,給一個無符號整數,如何快速判斷一個數是否在這40億個數中)
#include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> typedef struct BitMap { size_t* _bits
在一個字符串中,統計大寫字母個數,小寫字母個數,其他字符個數的四種算法
nload PC 這一 write pro ews toc title 指定 題目描述:編寫程序,輸出字符串中的大寫字母、小寫小母和其他的個數。如有一個字符串"Helle, This is A test textfile.123456, tannk you!!",則其大寫字
計算bit位為1的個數
1.迴圈法(Iterated Count) int bitcount (unsigned int n) { int count=0; while (n) { count += n & 0x1u ; n >>= 1 ; } return count ; } 最容易理解和想到的方
用遞迴的方法把一個無符號整數的每一位數字單獨寫出來,並且計算出每一位加起來的和。
這個題的具體含義是什麼呢? 例如: 給出一個無符號整數:1234 一千兩百三十四; 然後變成:1 2 3 4; 再把它們加起來:10; 所以很簡單的一道題,但是我們要用遞迴的思想寫
把一個無符號整數對應的十六進位制的前八位和末八位交換,中間的十六位也同理互換
例如0xfabcde12,變換後為:12debcfa 用位運算實現,再控制輸出; 程式碼如下: #include <stdio.h> using namespace std; in
求一個字符串中連續出現次數最多的子串
article 規律 生成 clu 一次 strong tor first sub 題目:求一個字符串中連續出現的次數最多的子串。 例如,字符串“abababc”,最多連續出現的為ab,連續出現三次。 思路: 例如字符串“abababc”,最多連續出現的為ab,連續出現
JS實現輸出一個字符串中第一個連續的三個數字
數字 length 個數字 pri split ret () 第一個 spl 問題描述:在一個字符串中,輸出其中第一個連續的三個數字。例如:str="1234568" 輸出:1 2 3。 var printNum = function(){ var str =
求一個字符串中出現同樣且長度最長的字符串
data 技術 alt fin sso 從大到小 popu jsb tex 題目:輸入一行字符串。找出當中出現的同樣且長度最長的字符串,輸出它及其首字符的位置。 比如:“yyabcdabjcabceg",輸出結果應該為abc
分別獲取一個字符串中的字母和數字
string ons ase 動態生成 repl brush 取出 str logs string str20 = "ABC123"; string strSplit1=string.Empty; string strSplit2=
提取一個字符串中的數字,並將其轉為數組
var ace fun 有米 blog 提取 function pan 一個 有米科技2017校招筆試題之一,以下是自己寫的,不代表最佳答案。 舉例:str = ‘fdfd22fifei42fkdfl5hf66‘; 結果應為:[22,42,5,66] var str =
在一個字符串中找到第一個只出現一次的字符
額外 掃描 循環 每次 時間 str 找到 一個 第一個只出現一次的 在一個字符串中找到第一個只出現一次的字符。如輸入abaccdeff,則輸出b。 (1)不使用額外空間,時間復雜度是O(n^2) 像冒泡排序那樣,內存循環對外循環判斷,比如第一個a,掃描後續元素,有a則不滿
在lua中從一個字符串中移除空間源碼
gis iss 字符 ase sea 移除 lists 字符串 std /* trim.c - based on http://lua-users.org/lists/lua-l/2009-12/msg00951.html from Sean Con
Javasrcipt中從一個url或者從一個字符串中獲取參數值得方法
控制臺 cat 包含 src regex fragment 常用 字符串操作 exp 從url中獲取參數值是che程序開發過程中的常用需求,偶然得閑,便抽空研究了一下javasrcipt下,獲取參數的辦法(JAVA中也類似)。 首先看url的規範: URL組成:protoc
請實現一個函數,將一個字符串中的空格替換成“%20”。例如,當字符串為We Are Happy.則經過替換之後的字符串為We%20Are%20Happy。
gpo 字符串 wchar tostring OS src clas string image replace兩種用法:replace(int start,int end, String str) repla
判斷一個字符串中出現次數最多的字符,統計這個次數
sdff BE 出現次數 div asd 遍歷 轉換成 arr str var str = ‘abaasdffggghhjjkkgfddsssss3444343‘; // 1.將字符串轉換成數組 var newArr = str.spl
統計一個字符串中大寫字母字符,小寫字母字符,數字字符出現的次數,其他字符出現的次數。
包含 abc 出現的次數 i++ r++ abcde g++ HA () /** * A:案例演示 * 需求:統計一個字符串中大寫字母字符,小寫字母字符,數字字符出現的次數,其他字符出現的次數。 * ABCDEabcd123456!