2013-08-03 41 views
0

我有一個存儲160位數的20個字/字節的數組。我怎樣才能找到從msb開始的第一個非零位。我需要找到位的位置,然後相應地從第一個'1'位置進行一些操作。如何找到從msb開始的第一個非零位

+4

我們展示你的代碼。 – Rohan

+3

[This](http://stackoverflow.com/questions/671815/what-is-the-fastest-most-efficient-way-to-find-the-highest-set-bit-msb-in-an-i ?rq = 1)可能會有所幫助 – rath

+0

[查找位數組中設置的最高有效位(最左側)]的可能重複(http://stackoverflow.com/questions/2589096/find-most-significant-bit -left最 - 即-IS-設置在所述位陣列) – SomeWittyUsername

回答

0

可以遍歷每個字節,直到找到第一個就是!= 0。這是等於零的每個字節,增加由8

計數器然後用字節,做右移位操作(>> 1),直到該值等於零。在每個班次,增加1。

5

前面的櫃檯如果你使用gcc,還有內置函數正是(和許多其他的東西)做

http://gcc.gnu.org/onlinedocs/gcc-4.5.4/gcc/Other-Builtins.html

你正在尋找的一個因爲可能是__builtin_clz(用於unsigned int),__builtin_clzl(用於unsigned long)或__builtin_clzll用於unsigned long long。

從文檔:

返回引領X 0位,從最高顯著位位置的數量。如果x爲0,結果是undefined

因此,從最重要的角度來看你的整數(longs?longlongs?),直到找到第一個不爲零的第一個整數。然後使用合適的__builtin_clz來找出它有多少前導零,以及32(64)減去該數字是數字中最高位1的位置!

當然,你總是可以實現__builtin_clz自己,如果你想與其它編譯器兼容的(如你應該!)