在程式設計中經常會遇到這樣乙個問題,即在乙個32位整數中,從右到左尋找第乙個為1的位。這樣的問題是很常見的,而面對這樣乙個問題,一種常見的解法就是逐位的遍歷這個整數中的所有位,直到遇到了為1的位。若第乙個為1的位出現在高位區域,逐位查詢比較的方法會比較非時間。
當我們在乙個陣列中尋找某數的時候,我們有什麼辦法?簡單的順序的遍歷整個陣列的思想是可行的,這樣的時間複雜度是o(n)。若陣列是乙個有序的陣列呢?我們一般會採用2分查詢的方式在乙個陣列中尋找某數,這樣找起來就比較快了,時間複雜度是o(logn)。那在乙個32位的int中尋找第乙個為1的數,能否使用2分查詢法呢?
在查詢第乙個為1的位時是可以使用2分查詢法的,那麼要如何使用2分法呢?關於位相關的操作一定不要忘了位運算,有效的運用位運算是可以實現對該問題的2分查詢法。
究竟如何進行2分查詢呢?
判斷某一位是否為1時可以使用&操作,那麼要判斷32位中的16位是否有1時要如何做到呢?用data & 0xffff即可。要判斷8位是否有1時可以data & 0xff,判斷4位是否有1可以data & 0xf,那麼判斷2位是否有1就可以用data & 0x3了。
分析到這裡,就已經有思路了,通過data與0xffff,0xff,0xf以及0x3等做&操作即可。
int binarysearch1(int data)
if ((data & 0xff) == 0)
if ((data & 0xf) == 0)
if ((data & 0x3) == 0)
if ((data & 0x1) == 0)
pos += 1;
return pos;
}
位運算在c語言中是非常重要的,很多有技巧性的優化都是通過位運算來實現,需要熟練掌握才行。
位運算與浮點二分
浮點二分 四個運算子 與 只有x,y都是1的時候,運算結果才是1,其餘為0 或 x,y只要有乙個為1,結果都為1 非 如果x是0,x 1,x是1的話,運算結果是0 異或 x y相同時0,不同是1 整形,分為有符號整型和無符號整型 int是32位二進位制 有符號整型中判斷正負看最高位數字,0為正數,1...
3 2二分查詢
輸入n值 1 n 1000 n個非降序排列的整數以及要查詢的數x,使用二分查詢演算法查詢x,輸出x所在的下標 0 n 1 及比較次數。若x不存在,輸出 1和比較次數。輸入格式 輸入共三行 第一行是n值 第二行是n個整數 第三行是x值。輸出格式 輸出x所在的下標 0 n 1 及比較次數。若x不存在,輸...
在微控制器中, 64 位整數除以 32 位整數
在微控制器中,64 位整數除以 32 位整數,因為沒有64位暫存器,所以需要自己實現 64 位除以 32 位 longword divex longword ahival,longword aloval,longword adivisor,longword ahiret,longword arema...