(L+R)/2 和 l+((R-L)>>1) 算法取中间值为什么内存溢出

11 篇文章 0 订阅
1 篇文章 0 订阅

怎么会
怎么会   想到 二十郎当小年轻在成年许久后 要用到在知识是小学知识
最近啊小年轻研习了下算法 (最基础的那种)
当学习到要求取数组中第一个N最右侧的 1 这里用到了二分法来加速寻找
说到这里 以为说的是二分法吗 不 绝对不是
遇到的问题是int内存溢出问题 这里首先设定L和N是 int 类型假如我们要取下标L和下标N之间的中间值 首先想到的其实是(L+N)/2 但是这里会出现一个问题 首先知道N的值是大于L的并且没有超出int 的范围 但是L+N的值是否超出int 的范围是一个不可控因素 所以此时重点出现了
可以换一种写法 L+(N-L)/2  这里用到了小学数学知识    通分
那为什么这样就不回内存溢出呢?
首先 L是没有溢出的 N是没有溢出的 (N-L)/2当然更不会溢出 那么 L+(N-L)/2 值是不会大于N 所以并不会出现溢出的问题
此时已经解决了int内存溢出的问题 接下来可以有更好的写法
根据计算机的结构 小年轻知道 位运算更加接近底层 越接近则运算越快
位运算比除运算快 但是随着技术的发展 加减运算和位运算相差不大
所以 如果可以用位运算 那一定是有帮助的 可以改写为 L+((R-L)>>1)

在位运算中   N/2 相当于N>>1           N*2+1 相当于((N<<1)| 1)
并且为了优先级的考虑 括号一定要注意 注意运算优先级 加减是优先于位运算的

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值