得到乙個2 N數

2021-06-22 08:18:36 字數 702 閱讀 3266

給定乙個數,使其轉換為2的冪的形式,而轉換後的資料大於或等於原始資料。

這裡給出兩種方式:窮舉和位運算,而後者的效率好於前者。

只要知道

2的冪的形式的2進製形式就可以了,1=(1)

2=1<<0,2=(10)

2=1<<1,4=(100)2=1<<2.。。。。64=(1000000)

2=1<<6

從而若乙個數的二進位制中,只有乙個1,那它就是2的冪的形式。

從而可以通過移位運算

/*判斷n是不是不2的冪

是:返回1

不是:返回0

*/int is_2n_v0(int n)

return 1;

}

同時可以發現,2^n-1,與2^n的與運算為0。從而這種方式,比上面的效率高

int is_2n(int n)

一種方式是先判斷它是否為

2的冪形式,若不是,則使其遞增,然後判斷。這種方式,效率不高,如為129,下乙個2的冪數為256,則它迴圈判斷。

另一種方式,就是通過位運算,判斷它的最高位1的位置,然後把後面的1清空,並使其左移一位。

int to_2n(int n)

/*最高位的1左移一位。

*/int to_2n_v2(int n)

return 1<

找大於等於乙個數的最小的2 n

最近看hashmap原始碼時,發現給定初始capacity計算threshold的過程很巧妙。1 static final int tablesizefor int cap 這裡是實現了找大於等於cap的最小2 n。cap為int型別,長度32位。對於乙個正數,找大於該數的最小的2 n,都可以採用這...

求乙個數字大於並最接近的2 N

無符號右移 無符號右移運算子 同右移,但是結果全變正數。或 或運算 二進位制中只要乙個為1就為1 在hashmap原始碼中有相關操作,直接分析原始碼如下 返回給定目標容量的2倍冪。將我們傳入的容量設定為大於並最接近的2 n 補位,將原本為0的空位填補為1,最後加1時,最高有效位進1,其餘變為0,如此...

給定乙個N位數,得到乙個N k位的數中最小的數

題目 給定乙個n位數,例如12345,從裡面去掉k個數字,得到乙個n k位的數,例如去掉2,4,得到135,去掉1,5,得到234。設計演算法,求出所有得到的 n k位數裡面最小的那乙個 解決方案一 1 第一步要確定剩餘n k位的數的最高位 從個位開始算起,從第n k位開始向高位比較,求出最小數字,...