算法中的技巧

算法中的技巧


(1)如果现在有整数区间是由2的次方或通过不同的2的次方相加得到, 例如:[1 ~ 2],   [1 ~ 4],  [1 ~ 6], 这其中的6就是通过(2^2 + 2)得到的;

         现在给你一个整数区间 [1 ~ n], 你需要找出属于 [1 ~ n]这个区间的最大上述形式的区间,怎么做?

         例如:给你区间 [1 ~ 7], 可以划分为 [1 ~ 6] + [7];

以下给出划分区间的方法:


只要求出最大端点值即可, 可以联想2^0 + 2^1 + 2^2 + 2^3 +······ 不就是区间的端点吗?这个端点表示形式不就是二进制转换到十进制的表示形式吗?

那好我们现在可以通过一个简单的算法实现 : 给出的区间右端点为n, 那么通过 n & (-n) 得到的值就是 n 与 所求右端点的差值;这样差值一出就可以简单算出右端点的值了;

例如 [1 ~ 7] 区间中n = 7, 则 7 & (-7) = 1, 所以右端点的值为7 - 1 = 6;故可以划分为[1 ~ 6] + [7];

这里的n & (-n)是“与”运算:7的二进制为 111, -7的二进制为7的  ‘补码’ 即 先得到7的 ‘反码’ 再加1得;7中得0变成1,1变成0得 000, 再加1得 001, 再通过与运算得

    1 1 1

&  0 0 1

------------                故结果为1;

    0 0 1


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值