對於乙個位元組(8 bit)的無符號整形變數,求其二進位制表示中「1」的個數,要求演算法的執行效率盡可能高、
解法一:通過整形資料除法的特點,通過相除和判斷餘數的值來分析。
int count(byte v)
v=v/2;
} return num;
}
解法二:使用位操作。
向右移位操作同樣可以達到相除的目的。唯一不同之處在於,移位之後如何來來判斷是否有1存在。在向右移位的過程中,我們會把最後一位直接丟棄。因此,需要判斷最後一位是否為1,「與」操作可以達到目的。可以把整個八位的數字與00000001進行「與」操作。如果為1,則表示當前八位數的最後一位為1,否則為0.
int count(byte v)
return num;
}
時間複雜度為o(log v)
解法三:
如何判斷給定的二進位制數裡面有且僅有乙個1呢?可以通過判斷這個數是否是2的整數次冪來實現。另外,如果只和這乙個「1」進行判斷,如何設計操作?我們知道,如果進行這個操作,結果為0或1,就可以得到結論。
如果希望操作後的結果為0,01000000可以與00111111進行「與」操作。
這樣,要進行的操作就是01000000 & (01000000-00000001) = 0
int count(byte v)
return num;
}
時間複雜度為o(m),其中m是v中1的個數。
解法四:分支操作
空間換時間。
解法五:查表法
典型的空間換時間的演算法,將0~255中「1」的個數直接儲存在陣列中,v作為陣列的下標,counttable[v]就是v中「1」的個數。演算法時間複雜度為o(1)。
2 1求二進位制數中1的個數
includeusing namespace std int count1 int a int count2 int n int count3 int n int main int count1 int a return num int count2 int n return num 前兩個解決方法...
求二進位制數中1的個數
解法一 可以舉乙個八位的二進位制例子來進行分析。對於二進位制操作,我們知道,除以乙個2,原來的數字將會減少乙個0。如果除的過程中有餘,那麼就表示當前位置有乙個1。以10 100 010為例 第一次除以2時,商為1 010 001,余為0。第二次除以2時,商為101 000,余為1。因此,可以考慮利用...
求二進位制數中1的個數
對於乙個位元組 8bit 的變數,求其二進位制表示中 1 的個數,要求演算法的執行效率盡可能地高。解法一 可以舉乙個八位的二進位制例子來進行分析。對於二進位制操作,我們知道,除以乙個2,原來的數字將會減少乙個0。如果除的過程中有餘,那麼就表示當前位置有乙個1。int count int v int ...