計算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 ; } 最容易理解和想到的方
計算一個無符整數中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
762. 二進位制表示中質數個計算置位 二進位制1的個數
給定兩個整數 L 和 R ,找到閉區間 [L, R] 範圍內,計算置位位數為質數的整數個數。 (注意,計算置位代表二進位制表示中1的個數。例如 21 的二進位制表示 10101 有 3 個計算置位。還有,1 不是質數。) 示例 1: 輸入: L = 6, R = 10
MySQL---統計表a中資料的總條數、統計表a中“狀態”欄位為“1”的條數
1、統計表a中資料的總條數: select count(id) from a 2、統計表a中“狀態”欄位為“1”的條數: select count(id) from a where fk_st
程式設計中無窮大的設定 很多人可能設為0x7fffffff,這個數的確是32-bit int的最大值,符號位為0,其他的都是1 但在很多情況下,0x7fffffff會出現錯誤,比如溢位,這樣兩個無窮大數相
很多人可能設為0x7fffffff,這個數的確是32-bit int的最大值,符號位為0,其他的都是1 但在很多情況下,0x7fffffff會出現錯誤,比如溢位,這樣兩個無窮大數相加會變成負數,還有如在做dijkstra求最短路時,當做鬆弛操作,判斷if (d[u]+w
求一個數被置為1的bit數目
程式設計中經常遇到用一個數的每個bit表示一個狀態,有時需要計算被置為1的bit數目。 方法1. 最直接的方法就是一位一位的判斷 U8 nonZeroBitNum(U32 x) { U8 num = 0; for(U8 i = 0; i++; i<32)
計算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
bitcount函式統計其整數引數的值為1的二進位制位的個數
/* bitcount: count 1 bits in x */ int bitcount(unsigned x) { int b; for (b = 0; x != 0; x >>= 1) if (x & 01)
.題目:請編寫一個c函式,該函式給出一個位元組中被置為1的位的個數
#include <stdio.h> int fun(int num) {static int count=0; //每一位與1判斷if(num % 2 & 1 == 1)
計算一個數的二進位制位中1的個數的方法總結
方法一、通過移位分別判斷各個位 int bit_count(unsigned int n) { int count; for(count=0;n;n>>=1) { count+=n&1; } return c
D. Powerful array 離線+莫隊算法 給定n個數,m次查詢;每次查詢[l,r]的權值; 權值計算方法:區間某個數x的個數cnt,那麽貢獻為cnt*cnt*x; 所有貢獻和即為該區間的值;
code ++ 計算方法 equal ati contains tdi ces sum D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes input st
LintCode算法題解——奇偶分割數組、二進制中1個數、反轉整數、加一、排序數組轉換為高度最小的二叉搜索樹、二進制求和
code style 求和 二進制 題解 二叉 following 算法題 targe Y3訟韭62獻si鏈倥8臣khttp://www.facebolw.com/space/2103837/following 7v6d04Vhpf玖忠http://www.facebol
清北學堂模擬賽d1t1 位運算1(bit)
main strlen 可能 難度 str 價值 100% int sin 題目描述LYK擁有一個十進制的數N。它賦予了N一個新的意義:將N每一位都拆開來後再加起來就是N所擁有的價值。例如數字123擁有6的價值,數字999擁有27的價值。假設數字N的價值是K,LYK想找到一
Codeforces Round #267 (Div. 2) B. Fedor and New Game【位運算/給你m+1個數讓你判斷所給數的二進制形式與第m+1個數不相同的位數是不是小於等於k,是的話就累計起來】
ons ecif 否則 ans contain rst rmi sum any After you had helped George and Alex to move in the dorm, they went to help their friend
使用分治法得到一個數中位元為1的個數
有這麼一個問題, 給定一個數(假定32位), 如何得到這個數轉為二進位制後1的個數? 解: X=(x & 0x55555555)+((x>>1)&0x55555555) X=(x & 0x33333333)+((x>>2)&
在升序陣列中:求絕對值最小的數:思路分三步,需要注意邊界:len = length-1,引數陣列個數為空,為1的條件等;
package com.interview.datastructure; import java.util.Arrays; public class MinAbsoluteValue { public static void main(String[] args) { int a
正確理解C語言指標中的 &a+1,假設a為一個數組
1.int a[5]={1,2,3,4,5}; int p=(int)(&a+1); printf("%d",*(p-1)); 答案為什麼是5? 這個問題的關鍵是理解 &a a是一個數組名,也就是陣列的首地址。 對a進行取地址運算子,得到的是一個指向陣列
Java計算二進位制數中1的個數
前言 逐位法 查表法 Brian Kernighan法 分治法 Hamming Weight法 Hamming Weight優化法 Hamming Weight乘法優化法 MIT HAKMEM 169演算法 江峰求一演算法 分治法