原题链接:https://leetcode.com/problems/reverse-bits/description/
实现如下:
import java.util.HashMap;
import java.util.Map;
/**
* Created by clearbug on 2018/2/26.
*/
public class Solution {
public static void main(String[] args) {
Solution s = new Solution();
System.out.println(s.reverseBits(2));
System.out.println(s.reverseBits(43261596));
}
/**
* 这道题目虽然是easy级别的,但是我却觉得不大easy。刚开始我的思路完全受限于“或、与、非、异或”这四种位操作的组合上了,以为会有什么巧妙的
* 组合能解决问题呢。。。没想到普通的移位操作用好了也能有神奇的效果!下面是讨论区别人的答案啦!
*
* 提交结果:beats 17.40%, runtime: 4ms
*
* @param n
* @return
*/
// you need treat n as an unsigned value
public int reverseBits(int n) {
int result = 0;
for (int i = 0; i < 32; i++) {
result += n & 1;
n >>>= 1; // CATCH: must do unsigned shift
if (i < 31) { // CATCH: for last digit, don't shift!
result <<= 1;
}
}
return result;
}
// 然后答案的原作者又提出了一种多次调用情况下使用 HashMap 做缓存来提高效率的做法
// 当然了,下面的评论里面还有更简洁更高效的方法,思路基本差不多,只不多优化了细节:
public int reverseBits2(int n) {
int result = 0;
for(int i=0; i<32; i++){
result <<= 1;
result += n&1;
n >>= 1;
}
return result;
}
}