[ 收藏此頁] [
列印]【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為正整數 我...