来自Leetcode第190题颠倒二进制位
颠倒给定的 32 位无符号整数的二进制位。
示例 1:
1 | 输入: 00000010100101000001111010011100 |
Integer.reverse()
public int reverseBits(int n) {
return Integer.reverse(n);
}
错位交换
其实就是Integer.reverse的源码。
1 | 初始为 abcdefghijklmnopqrstuvwxyz012345 |
这种换法本质是错位法 即创造两个互相错位的数据 这样保证数据不会丢失
好比两排16个的麻将 一排拿掉后边8个, 再右移8个单位, 另一排拿掉前面8个, 再左移8个单位, 再合并, 那么便得到了一排16个的麻将 但前8和后8的相对位置不变, 但整体位置却前后变换了. 再一排拿掉中间的4个, 右移4位 另一排同理 再合并. 所以这个算法实际上模拟的这个过程. 下面用数字解释:
如何创造? 先屏蔽 再移位 比如要创造4位错位, 即12345678换位56781234, 那么先屏蔽5678得到12340000, 移位得到00001234, 同理可得56780000, 再加起来得到56781234; 然后再2位错位, 即屏蔽得到56001200, 移位得到00560012, 同理可得78003400, 加起来得到78563412; 再创造一位错位, 即先屏蔽得到70503010,移位得到07050301, 同理可得80604020, 加起来就是最后结果即87654321.
1 | public int reverseBits(int n) { |
移位
用一个变量 res
去存储结果,依次得到要转换数字的低位,然后依次保存到 res
中。res
每得到一位后进行左移腾出位置保存下一位。
1 | public int reverseBits(int n) { |