找到一個數最接近的比它大的2的n次冪的程式碼分析

bleuIL發表於2024-10-02
pub fn f1(mut n: u32) -> u32 {
    n = n | (n >> 1);
    n = n | (n >> 2);
    n = n | (n >> 4);
    n = n | (n >> 8);
    n = n | (n >> 16);
    n
}

  如果n的輸入型別為 u32(32位無符號整型), 上述程式碼的結果為大於等於n的2^k - 1的值(因為可能會出現溢位,所以並沒有直接返回2^k),二進位制表現為從最高有效位開始全為 1例:n = 00001010, 則返回值的二進位制為 00001111。如果是 u64,只需在函式里再加上 n = n | (n >> 32)。以下是我對於上述程式碼的理解。

  我們思考程式碼如何執行的時候,只需要記住,原n的二進位制的最高有效位是關鍵,其它位置不重要。假如 n = 17, n 的 u8 二進位制為 00010001,執行上述程式碼會返回 31,二進位制為 00011111。

  找到一個數最接近的比它大的2的n次冪的程式碼分析

  在執行n = n | (n >> 1) 時,目的是讓前 2 位最高有效位變為 1,

  找到一個數最接近的比它大的2的n次冪的程式碼分析

  在執行n = n | (n >> 2) 時,目的是讓前 4 位最高有效位變為 1,

  找到一個數最接近的比它大的2的n次冪的程式碼分析

  根據以上規律,程式碼執行到返回的結果就是從最高有效位開始,所有位數的值都為1,結束!

相關文章