當前位置:
首頁 >
剖析大神代码,计算整型里面1的个数
發布時間:2023/12/20
39
豆豆
生活随笔
收集整理的這篇文章主要介紹了
剖析大神代码,计算整型里面1的个数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
昨天的文章,可能很多人看了不知道怎么回事,確實,我也是看了之后一頭霧水。
先給出個簡單的例子
#include "stdio.h"int count_bits4(char x) {x = (x&0x55) + ((x>>1)&0x55);x = (x&0x33) + ((x>>2)&0x33);x = (x&0x0F) + ((x>>4)&0x0F);return x; }int main() {printf("%x\n",count_bits4(0x12)); }輸出:
我們現看看下面這段 0x55 = 0b01010101 0x33 = 0b00110011 0x0F = 0b00001111
這個圖片需要解釋一下 相鄰兩個數不斷相加,直到這個數據的長度
#舉個例子
比如我有一個數字,0x34。我要計算0x34里面有多少個1。轉成二進制是 0b00110100,這時候,我把它們相鄰的二進制位先相加起來。第二步,就是需要把相鄰兩位的數加起來,第三步,就是把相鄰的四位數加起來。
#復雜一點的
#include "stdio.h"int count_bits3(long long s) {s = (s&0x5555555555555555L) + ((s>>1)&0x5555555555555555L);s = (s&0x3333333333333333L) + ((s>>2)&0x3333333333333333L);s = (s&0x0F0F0F0F0F0F0F0FL) + ((s>>4)&0x0F0F0F0F0F0F0F0FL);s = (s&0x00FF00FF00FF00FFL) + ((s>>8)&0x00FF00FF00FF00FFL);s = (s&0x0000FFFF0000FFFFL) + ((s>>16)&0x0000FFFF0000FFFFL);s = (s&0x00000000FFFFFFFFL) + ((s>>32)&0x00000000FFFFFFFFL);return (int)s; } int main() {printf("%x\n",count_bits3(0x122312351345134)); }輸出:
我們搞清楚了上面的那段代碼,再看下面這段代碼,是不是覺得沒那么吃力了?
#實測大神的代碼如何吊打普通代碼
test1.c
#include?"stdio.h" #include?<time.h> int?count_bits(int?x) {register?int?xx=x;xx=xx-((xx>>1)&0x55555555);xx=(xx&0x33333333)+((xx>>2)&0x33333333);xx=(xx+(xx>>4))&0x0f0f0f0f;xx=xx+(xx>>8);return?(xx+(xx>>16))?&?0xff; } int?main(void) {clock_t?start,?end;start?=?clock();unsigned?int?i?=?0;for(i?=?0;i<10000000;i++){count_bits(12345678);}printf("%d\n",count_bits(12345678));end?=?clock();double?seconds??=(double)(end?-?start)/CLOCKS_PER_SEC;fprintf(stderr,?"Use?time?is:?%.8f?s\n",?seconds);return?(0); }test2.c
#include?"stdio.h" #include?<time.h> int?count_bits2(int?x) {int?i?=?0;int?s?=?0;for(i?=?0;i<32;i++){if(x&0x01)s?++;x?=?x>>1;}return?(s); } int?main(void) {clock_t?start,?end;start?=?clock();unsigned?int?i?=?0;for(i?=?0;i<10000000;i++){count_bits2(12345678);}printf("%d\n",count_bits2(12345678));end?=?clock();double?seconds??=(double)(end?-?start)/CLOCKS_PER_SEC;fprintf(stderr,?"Use?time?is:?%.8f?s\n",?seconds);return?(0); }運行:
$ gcc test2.c -o test2 $ gcc test1.c -o test1 $ ./test1 12 Use time is: 0.02542700 s ./test2 12 Use time is: 0.44449600 s $#其他方法
在上一篇文章里面,有幾個讀者說了另外幾種方法用來解決這個問題的代碼。欣賞一下
代碼是程序員的藝術,認真對待代碼,讓自己變成一個和亞里士多德一樣優秀的工程師。
u8 cnt; while(value) {value &= value - 1;cnt++; } return cnt; public int NumberOf1(int n) {int count = 0;while (n != 0) {n = n & (n - 1);count += 1;}return count;}? 回復「?籃球的大肚子」進入技術群聊
回復「1024」獲取1000G學習資料
總結
以上是生活随笔為你收集整理的剖析大神代码,计算整型里面1的个数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop环境搭建(6) -- 克隆
- 下一篇: 周一地铁遐想