题目:
颠倒给定的 32 位无符号整数的二进制位。
示例:
输入: 43261596 输出: 964176192 解释: 43261596 的二进制表示形式为 00000010100101000001111010011100 , 返回 964176192,其二进制表示形式为 00111001011110000010100101000000 。
进阶:
如果多次调用这个函数,你将如何优化你的算法?
解题思路:
从末尾开始每一次都提取最后的一位,然后乘以基数2。
也可以通过对整体进行块变换,达到翻转的目的。
代码实现:
基本版:
public class Solution { // you need treat n as an unsigned value public int reverseBits(int n) { int res = 0; for (int i = 0; i < 32; i ++) { res <<= 1; res += n & 1; n >>= 1; } return res; } }
块变换:
public class Solution { // you need treat n as an unsigned value public int reverseBits(int n) { n = (n << 16) | (n >>> 16); n = ((n & 0x00ff00ff) << 8) | ((n & 0xff00ff00) >>> 8); n = ((n & 0x0f0f0f0f) << 4) | ((n & 0xf0f0f0f0) >>> 4); n = ((n & 0x33333333) << 2) | ((n & 0xcccccccc) >>> 2); n = ((n & 0x55555555) << 1) | ((n & 0xaaaaaaaa) >>> 1); return n; } }