日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

统计整数n的二进制表示中1的个数

發布時間:2024/8/23 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 统计整数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的个数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。