找到一个数最接近的比它大的2的n次幂的代码分析

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,结束!

posted @ 2024-10-02 16:47  bleuIL  阅读(6)  评论(0编辑  收藏  举报