首先bit-wise reverse指按位倒转,比如二进制11010101,倒转以后变成10101011
此问题有很精巧的解法,先贴代码
public static int reverse(int i) {
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;
}
主要思路是,比如要倒转11010101
只需要将其一分为二即1101和0101,分别倒转这两部分,然后交换位置就可以了
1101 倒转变成 1011
0101 倒转变成 1010
再交换位置得结果10101011
至于怎么倒转那两部分,同样的方法,最后到你只需要交换两位的时候就相当简单了
这思路乍一看上去复杂度好像是Θ(n),但实际上你并不需要完全按照这个思路写代码,这个思路只是方便理解
比如上例中,到了要倒转1101和0101两部分的时候,其实一步就可以完成,不需要先倒转1101再0101,具体方法参见代码
同理要倒转11,01,01,01这四部分的时候也可以一步完成
所以复杂度实际上是Θ(log(n))