统计整数n的二进制表示中1的个数
生活随笔
收集整理的這篇文章主要介紹了
统计整数n的二进制表示中1的个数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
(1)逐位判斷(位運算)
int counter_ones(unsigned n)
{
int counter = 0;
While (n) {
counter += n&1;
n >>=1;
}
return counter;
}
(2)一個整型不為0,那么二進制表示時,至少包含一位1。如果整數減去1,那么最右邊的1變成0,而該1后面的0變成1,其余位不變。將原來的整數和減去1后的數做與運算,從原來最右邊的那個1開始所有的,所有位變成0,如:1100&(1100-1=1011)=1000。也就是說整數與該數-1后做與運算,會把最右邊一個1變成0。
int counter_ones(unsigned n)
{
int counter = 0;
While (n) {
counter++;
n &= (n-1);
}
return counter;
}
(3)查表法
將32位(64位)整型數分切割成n個區間,每個區間位長位8。分別統計每個位區間中1個個數,然后相加。
static const unsigned char BitsSetTable256[256] =?
{
# ? define B2(n) n, ? ? n+1, ? ? n+1, ? ? n+2
# ? define B4(n) B2(n), B2(n+1), B2(n+1), B2(n+2)
# ? define B6(n) B4(n), B4(n+1), B4(n+1), B4(n+2)
? ? B6(0), B6(1), B6(1), B6(2)
};
int counter_ones(unsigned n)
{
int counter = 0;
for (; n > 0; n >> 8) {
counter += BitsSetTable256[n&255];
}
return counter;
}
Or
int counter_ones(unsigned n)
{
? ? ? ? ?char *p = (char *)&n;
? ? ? ? ?return BitsSetTable256[*p] + BitsSetTable256[*(p+1)] + BitsSetTable256[*(p+2)] + BitsSetTable256[*(p+3)]
}
(4)歸并法。
對于一個32位整數,先分成16組,每組2位,統計其中1個數,然后將統計的結果兩兩合并,得到8組,然后再此基礎上,合并得到4,2,1,最總得到結果。
int counter_ones(unsigned n)
{
n = (n & 0x55555555) + ((n >> 1) & 0x55555555);
n = (n & 0x33333333) + ((n >> 2) & 0x33333333);
n = (n & 0x0f0f0f0f) + ((n >> 4) & 0x0f0f0f0f);
n = (n & 0x00ff00ff) + ((n >> 8) & 0x00ff00ff);
n = (n & 0x0000ffff) + ((n >> 16) & 0x0000ffff);
return n;
}
參考:http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive
總結
以上是生活随笔為你收集整理的统计整数n的二进制表示中1的个数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转载保存】lucene3.0可以对do
- 下一篇: 根据经纬度显示地图轨迹