java 1除以2_代码优化之整型除以2的指数并四舍五入
引子
前几天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的指数并四舍五入相关推荐
- char怎么比较_为什么阿里巴巴Java开发手册中强制要求整型包装类对象值用 equals 方法比较?...
在阅读<阿里巴巴Java开发手册>时,发现有一条关于整型包装类对象之间值比较的规约,具体内容如下: 这条建议非常值得大家关注, 而且该问题在 Java 面试中十分常见. 还需要思考以下几个 ...
- Java 和 .NET 获得毫秒级长整型数值的差异和解决
2019独角兽企业重金招聘Python工程师标准>>> 维护的某系统中有个用 Java 写的生成唯一标识的类,主要是靠"Calendar.getInstance().get ...
- java整形变量转换字符串_JAVA整型转换字符串以及相互转换的相关实例
JAVA整型转换字符串以及相互转换的相关实例.java数据类型之间的转换.怎么把整数 int 转换成字串 String ?怎么把字符串 String 转换成整数 int类型? 整型与字符串转换实例: ...
- java字符转整形_java中整型与字符型互转
1.字符型转换成整型: 1.转换成Int型 int/Integer num = Integer.parseInt(String str); 2.转换成long型 Long/long num ...
- c语言赋值小数,c语言中将一个浮点型赋值给整型时,会不会四舍五入?
c语言中将一个浮点型赋值给整型时,不会四舍五入,会直接舍去小数部分的数据,也可以认为是执行了下取整运算. 将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分,只保留整数部分.将整型值赋给浮点型变 ...
- java mac 转换 整形_JAVA的整型与字符串相互转换
1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([S ...
- java整型数组字符串相互转换,java数组与字符串相互转换、整型与字符串相互转换【详解】...
1.char数组(字符数组)->字符串 可以通过:使用String.copyValueOf(charArray)函数实现. 举例: char[] arr={'a','b','c'}; Strin ...
- java整型_java中长整型定义
展开全部 Java的整型最大值e69da5e6ba9062616964757a686964616f31333337396166/长整型和短整型最大值及表示法定义代码:public class Damo ...
- php 整形转浮点型,整型与浮点型相互转换
C语言浮点型转换为整型怎么转换的? 例如 float a=5.75 (int)a 夜影驱动编程小编今天和大家分享出来是5,为什么不是6? C语言有以下几种取整方法: 直接赋值给整数变量.如: int ...
最新文章
- Java基础语法(一)注释,关键字,常量,变量,数据类型,标识符,数据类型转换...
- 代码中的输入输出(重定向、文件流C/C++)
- MySQL学习第四章课后题
- Web前端技术分享:Javascript中的内置对象数组讲解
- 图片上传组件_配置Django-TinyMCE组件 实现上传图片功能
- LOB字段存放在指定表空间 清理CLOB字段及压缩CLOB空间
- 基于JAVA+SpringMVC+Mybatis+MYSQL的校园失物招领系统
- text/x-jquery-tmpl做分页查询
- python app开发框架_Python可以开发APP吗?用哪个框架?
- Python配置OpenCV
- Googler在中国的“幸福”生活
- ARM裸机篇(三)——i.MX6ULL第一个裸机程序
- 转:在浅薄时代,如何成为有深度的管理者?
- Android 使用三种方式缓存加载 倒影图片
- VUE | key的内部原理、Vue监测数据的原理、Vue.set()和vm.$set()的使用
- 丁腈橡胶自然老化时间_影响丁腈橡胶老化的因素研究
- Excel数值函数(3):对“自动筛选”的结果求和、平均值、极值等
- 智能交通组合拳--飞桨实现车辆类别/车牌/车速检测、跨境头跟踪、车流密度检测、逆行检测
- Codeforces Round #703 (Div. 2)C1C2	 Guessing the Greatest(二分)
- 【深度学习】ResNet残差网络 ResidualBlock残差块实现(pytorch) | 跟着李沐学AI笔记 | ResNet18进行猫狗分类
热门文章
- ardupilot BMI088加速度陀螺仪学习
- conda install出现CondaValueError: Malformed version string invalid character(s)解决方案
- LVM源码分析3-lvextend
- 交换机端口安全技术(IEEE802.1X
- 数据中心供配电系统节能措施
- 三星电视与android手机,三星难敌谷歌安卓,放弃自研系统Tizen,彻底沦为电视专属系统...
- ubuntu-开机黑屏问题分析
- bootstrap修改样式表
- linux重定向操作
- 利用requests库下载bilibili字幕文件