复杂度Θ(log(n))的bit-wise reverse

首先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))



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值