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。
在執行n = n | (n >> 1)
時,目的是讓前 2 位最高有效位變為 1,
在執行n = n | (n >> 2)
時,目的是讓前 4 位最高有效位變為 1,
根據以上規律,程式碼執行到返回的結果就是從最高有效位開始,所有位數的值都為1,結束!