判斷32位整數二進位制中1的個數

2021-06-05 23:09:43 字數 1218 閱讀 8351

[ 收藏此頁] [

列印]【it168知識庫】

判斷32位整數二進位制中1的個數

<

iostream

>

using

namespace

std;

intfindone(unsigned 

intn)

intmain()

2、優化:

這樣的時間複雜度是t(m)=m,取決於二進位制數的位數m。如果要求在更短時間內求出,應該如何做呢?如果findone函式被反覆呼叫(成千上萬次呼叫),那應該怎麼優化呢?

其實就是空間換時間的思想:可以預建立乙個表,存放了從0~2^32每個數中1的個數,用時去查一下表就知道了。但這樣顯然要耗費很多的空間(至少2^32/(256/32)=512mb,哈哈,正是一般記憶體大小)。於是需要再優化:存放0-255每個數中1的個數,然後分段查詢。如下面把32位數分為4段,每段乙個位元組,所以有乙個256大小供查詢的表:

char

tone[

256]="

\0\1\1\2\1\2……"; 

//後面省略

intfindone(unsigned 

intn)

3、據說intel中有條彙編指令(或是數條)即可完成這個工作,但不知道具體是什麼,應該怎樣做。

4、又看到有道ms的筆試題殊途同歸:

func(unsigned 

intn)

return

count;

程式如下:

#include

#include

#include

#include

int count=0x7fffffff;

unsigned int func(unsigned int x)

int one_in_char[256];

int func2(int *v)

void test_1()

t2 = time(null);

printf("time of func: %d   v2=%d\n", t2-t1, v2); }

void test_2()

t2 = time(null);

printf("time of func2: %d   v2=%d\n", t2-t1, v2); }

int main(int argc, char **argv)

判斷32位無符號整數二進位制中1的個數

1 比較簡單和容易理解的方法就是逐位比較法 include using namespace std int findone unsigned int n int main 這種方法的缺點是比較費時,時間長度取決於n的位數,時間複雜度o n 假如上千上萬位的話,每一位都要執行一遍,所用時間就很長了。2...

求32位整數二進位制中1的個數

unsigned long func unsigned long x unsigned intfunc unsigned intx return countx 每次減1再做或運算就可以乾掉從後向前數的第乙個1 還有其他經典演算法可以在 參考文獻 中找到。自 http blog.chinaunix.n...

判斷二進位製半整數(二進位制)

10年後,tokitsukaze大佬已經變成了年收入超百萬的的精英程式設計師,家裡沒錢也沒礦的teitoku,找tokitsukaze大佬借1000塊錢,然後tokitsukaze大佬說,借你1024吧,湊個整數。沒錯在2進製下1024是 二進位制整數 乙個正整數滿足其值為2的k次方 k為正整數 我...