刷Leecode时,遇到了一个题,让颠倒给定的二进制位,题目如下:
颠倒二进制位https://leetcode-cn.com/problems/reverse-bits/ 这个题已经有不少的解法。其中可以用Java自带的函数去解决 Integer.reverse(int n)。本文详细探究该方法。
关于该方法的代码段如下:
/**
* Returns the value obtained by reversing the order of the bits in the
* two's complement binary representation of the specified {@code int}
* value.
*
* @param i the value to be reversed
* @return the value obtained by reversing order of the bits in the
* specified {@code int} value.
* @since 1.5
*/
public static int reverse(int i) {
// HD, Figure 7-1
i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555;
i = (i & 0x33333333) << 2 | (i >>> 2) & 0x33333333;
i = (i & 0x0f0f0f0f) << 4 | (i >>> 4) & 0x0f0f0f0f;
i = (i << 24) | ((i & 0xff00) << 8) |
((i >>> 8) & 0xff00) | (i >>> 24);
return i;
}
该方法体现了分治的思想,将一个32个数字序列的反转问题不断划分,进而转换为16,8,4,2个数字序列的反转问题。下面将给出相应的证明。
设 ,
证明反转的结果为
故得证!