引子

前几天QQ群里一位好友提出来一个问题: "整型(有正有负)除以2的指数结果四舍五入, 应该如何优化呢", 当时做了答, 发表在这里, 希望对大家有用.

符号约记

下取整函数的定义: $\left\lfloor x \right\rfloor = \max \left{ {z \in \mathbb{Z}:z \leqslant x} \right}$

上取整函数的定义: $\left\lceil x \right\rceil = \min \left{ {z \in \mathbb{Z}:z \geqslant x} \right}$

四舍五入取整函数的定义: $\left[\kern-0.15em\left[ x

\right]\kern-0.15em\right] = \left{ {\begin{array}{*{20}{c}}

{\left\lfloor {x + 0.5} \right\rfloor }&{x > 0} \

{\left\lceil {x - 0.5} \right\rceil }&{x \leqslant 0}

\end{array}} \right.$

正文

问题: 整型(有正有负)除以2的指数结果四舍五入, 应该如何优化呢?

问题转化为: 将 $\left[\kern-0.15em\left[ {\frac{m}{2^k}} \right]\kern-0.15em\right]$ 转化为向下取整的形式,其中 $m$ 为整数, $k$ 为非负整数.

答: 因为 $\left[\kern-0.15em\left[ {\frac{m}{n}}

\right]\kern-0.15em\right] = \left{ {\begin{array}{*{20}{c}}

{\left\lfloor {\frac{m}{n} + \frac{1}{2}} \right\rfloor = \left\lfloor {\frac{1}{n}\left( {m + \left\lfloor {\frac{n}{2}} \right\rfloor } \right)} \right\rfloor }&{mn \geqslant 0} \

{\left\lceil {\frac{m}{n} - \frac{1}{2}} \right\rceil = \left\lceil {\frac{1}{n}\left( {m - \left\lfloor {\frac{n}{2}} \right\rfloor } \right)} \right\rceil }&{mn < 0}

\end{array}} \right.$, 其中 $m, n$ 均为整数, $n \neq 0$.

特别地, 设 $n = 2^k$ ( $k$ 为非负整数) 时, 当 $k=0$ 时, $\left[\kern-0.15em\left[ m \right]\kern-0.15em\right] = m$;

当 $k>0$ 时, $\left[\kern-0.15em\left[ {\frac{m}{{{2^k}}}}

\right]\kern-0.15em\right] = \left{ {\begin{array}{*{20}{c}}

{\left\lfloor {\frac{m}{{{2^k}}} + \frac{1}{2}} \right\rfloor = \left\lfloor {\frac{1}{{{2^k}}}\left( {m + \left\lfloor {\frac{{{2^k}}}{2}} \right\rfloor } \right)} \right\rfloor = \left\lfloor {\frac{{m + {2^{k - 1}}}}{{{2^k}}}} \right\rfloor }&{m \geqslant 0} \

{\left\lceil {\frac{m}{{{2^k}}} - \frac{1}{2}} \right\rceil = \left\lceil {\frac{1}{{{2^k}}}\left( {m - \left\lfloor {\frac{{{2^k}}}{2}} \right\rfloor } \right)} \right\rceil = \left\lceil {\frac{{m - {2^{k - 1}}}}{{{2^k}}}} \right\rceil }&{m < 0}

\end{array}} \right.$.

又因为 $\left\lceil {\frac{m}{n}} \right\rceil = \left{ {\begin{array}{*{20}{c}}

{\left\lfloor {\frac{{m + n - 1}}{n}} \right\rfloor = \left\lfloor {\frac{{m - 1}}{n}} \right\rfloor + 1}&{n > 0} \

{\left\lfloor {\frac{{m + n + 1}}{n}} \right\rfloor = \left\lfloor {\frac{{m + 1}}{n}} \right\rfloor + 1}&{n < 0}

\end{array}} \right.$,

所以 $\left\lceil {\frac{{m - {2^{k - 1}}}}{{{2^k}}}} \right\rceil = \left\lfloor {\frac{{m - {2^{k - 1}} + {2^k} - 1}}{{{2^k}}}} \right\rfloor = \left\lfloor {\frac{{m + {2^{k - 1}} - 1}}{{{2^k}}}} \right\rfloor$.

综上, $\left[\kern-0.15em\left[ {\frac{m}{{{2^k}}}} \right]\kern-0.15em\right] = \left{ {\begin{array}{*{20}{c}}

m&{k = 0} \

{\left\lfloor {\frac{{m + {2^{k - 1}}}}{{{2^k}}}} \right\rfloor }&{k > 0,m \geqslant 0} \

{\left\lfloor {\frac{{m + {2^{k - 1}} - 1}}{{{2^k}}}} \right\rfloor }&{k > 0,m < 0}

\end{array}} \right.$.

上式可以很方便地转写为只包含加减和位运算的C/C++代码.

const int INT_BITS = 32;

int div_exp2(int x, unsigned char k)

{

if (k == 0) return x;

int tail = x >> (INT_BITS - 1);

return (x + (1 << (k - 1)) + tail) >> k;

}

测试代码

#include

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[代码优化之整型除以2的指数并四舍五入]http://www.zyiz.net/tech/detail-136988.html

java 1除以2_代码优化之整型除以2的指数并四舍五入相关推荐

  1. char怎么比较_为什么阿里巴巴Java开发手册中强制要求整型包装类对象值用 equals 方法比较?...

    在阅读<阿里巴巴Java开发手册>时,发现有一条关于整型包装类对象之间值比较的规约,具体内容如下: 这条建议非常值得大家关注, 而且该问题在 Java 面试中十分常见. 还需要思考以下几个 ...

  2. Java 和 .NET 获得毫秒级长整型数值的差异和解决

    2019独角兽企业重金招聘Python工程师标准>>> 维护的某系统中有个用 Java 写的生成唯一标识的类,主要是靠"Calendar.getInstance().get ...

  3. java整形变量转换字符串_JAVA整型转换字符串以及相互转换的相关实例

    JAVA整型转换字符串以及相互转换的相关实例.java数据类型之间的转换.怎么把整数 int 转换成字串 String ?怎么把字符串 String 转换成整数 int类型? 整型与字符串转换实例: ...

  4. java字符转整形_java中整型与字符型互转

    1.字符型转换成整型: 1.转换成Int型 int/Integer num  =  Integer.parseInt(String str); 2.转换成long型 Long/long num     ...

  5. c语言赋值小数,c语言中将一个浮点型赋值给整型时,会不会四舍五入?

    c语言中将一个浮点型赋值给整型时,不会四舍五入,会直接舍去小数部分的数据,也可以认为是执行了下取整运算. 将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分,只保留整数部分.将整型值赋给浮点型变 ...

  6. java mac 转换 整形_JAVA的整型与字符串相互转换

    1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([S ...

  7. java整型数组字符串相互转换,java数组与字符串相互转换、整型与字符串相互转换【详解】...

    1.char数组(字符数组)->字符串 可以通过:使用String.copyValueOf(charArray)函数实现. 举例: char[] arr={'a','b','c'}; Strin ...

  8. java整型_java中长整型定义

    展开全部 Java的整型最大值e69da5e6ba9062616964757a686964616f31333337396166/长整型和短整型最大值及表示法定义代码:public class Damo ...

  9. php 整形转浮点型,整型与浮点型相互转换

    C语言浮点型转换为整型怎么转换的? 例如 float a=5.75 (int)a 夜影驱动编程小编今天和大家分享出来是5,为什么不是6? C语言有以下几种取整方法: 直接赋值给整数变量.如: int ...

最新文章

  1. Java基础语法(一)注释,关键字,常量,变量,数据类型,标识符,数据类型转换...
  2. 代码中的输入输出(重定向、文件流C/C++)
  3. MySQL学习第四章课后题
  4. Web前端技术分享:Javascript中的内置对象数组讲解
  5. 图片上传组件_配置Django-TinyMCE组件 实现上传图片功能
  6. LOB字段存放在指定表空间 清理CLOB字段及压缩CLOB空间
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的校园失物招领系统
  8. text/x-jquery-tmpl做分页查询
  9. python app开发框架_Python可以开发APP吗?用哪个框架?
  10. Python配置OpenCV
  11. Googler在中国的“幸福”生活
  12. ARM裸机篇(三)——i.MX6ULL第一个裸机程序
  13. 转:在浅薄时代,如何成为有深度的管理者?
  14. Android 使用三种方式缓存加载 倒影图片
  15. VUE | key的内部原理、Vue监测数据的原理、Vue.set()和vm.$set()的使用
  16. 丁腈橡胶自然老化时间_影响丁腈橡胶老化的因素研究
  17. Excel数值函数(3):对“自动筛选”的结果求和、平均值、极值等
  18. 智能交通组合拳--飞桨实现车辆类别/车牌/车速检测、跨境头跟踪、车流密度检测、逆行检测
  19. Codeforces Round #703 (Div. 2)C1C2 Guessing the Greatest(二分)
  20. 【深度学习】ResNet残差网络 ResidualBlock残差块实现(pytorch) | 跟着李沐学AI笔记 | ResNet18进行猫狗分类

热门文章

  1. ardupilot BMI088加速度陀螺仪学习
  2. conda install出现CondaValueError: Malformed version string invalid character(s)解决方案
  3. LVM源码分析3-lvextend
  4. 交换机端口安全技术(IEEE802.1X
  5. 数据中心供配电系统节能措施
  6. 三星电视与android手机,三星难敌谷歌安卓,放弃自研系统Tizen,彻底沦为电视专属系统...
  7. ubuntu-开机黑屏问题分析
  8. bootstrap修改样式表
  9. linux重定向操作
  10. 利用requests库下载bilibili字幕文件