向上取整再分析

chatgpt/2023/9/27 17:38:01

先看两个简单的数学问题:

  1. 一个青蛙跳跃一次的长度为3,现在它垂直于马路方向要跳跃整条马路。假定马路的宽为x长? 问:它最少需要跳跃几次能够完全跳过这条马路?

  2. 一个房间可以住6个人,现在来了一群人,人数为x,问最少需要多少个房间才能让这x个人都可以住下? 假设一个房间住满的情况下,才安排另外一个房间。

问题分析:

假设马路的长度是10,青蛙一次跳3,跳3次的距离是9 ,4次的距离是12,为了能完全跳过马路,需要跳跃4次

10/3 + 1 = 4

如果马路的长度是12,为了能完全跳过马路,需要跳跃4次:

12/3 = 4

如果马路的长度是13,需要5次才能完全过去:

13/3 + 1 = 5 

所以,这两个题目, 都是同样的道理,不难得出结论:

result = (x%n == 0) ? (x/n) : (x/n + 1)

三目运算可以解决此类问题,但针对此类问题有一个较为巧妙的算法公式, 分子是总量加上步长减去1 ,运算后的结果再去除以步长:

result =(x+n-1/ n

计算机中的整数运算是向下取整的,也就是如果能整除,没有余数,那结果正好;如果不能整除,有余数,就将余数舍弃,保留相除后的整数部分。但此时正好和我们想要的结果(向上取整)相差一,正确的结果需要加上这个一。

下面是对这个公式的分析:

  • 因为x/n的余数(计为z)总小于n,这样就能保证,余数(z + n-1) < 2n,所以z + (n-1)/n的值不是0就是1,如果z == 0z + (n-1)/n = 0 ,如果z > 0z + (n-1)/n = 1

  • 所以:result =(x+n-1)/ n,就能保证:如果x+n-1的余数等于n-1x/n刚好能够整除余数z0,向上取整不需要加1,如果x+n-1的余数大于n-1,那么x/n不能整除,有余数(z),向上取整就需要x/n + 1,这里的1就是(z+n-1)/n = 1

所以在C语言中,ceil函数可以使用以下公式:

int ceil(int x, int y) {return (x + y - 1) / y;
}

这个公式的原理和上面提到的一样,当x除以y时,如果x不能被y整除,那么向上取整后的结果应该是x除以y的商加上 1。

结合移位运算-实例分析

假设收到比特流157位,利用位运算如何得出占据多少个字节。

157 + 7 >> 3得到20字节:

// 157 +7 >> 3的二进制过程为:(用8位表示)10011101+      111
--------------10100000>>3
--------------00010100=20

对157/8向上取整的做法:157除以8,如果有余数就对结果+1。

这里位运算的思想是:除以8,在位运算中就是右移3位,丢掉最后的3位。因为是向上取整,所以如果最后3位中只要有一个1,就不能单纯地丢掉这3位。都需要将第四位+1,表现出来的形式就是+7。

看一下7的二进制表示就很明显了,7的二进制是0b111,如果某个数的最后3位只要有一个1,再加上7,那么最终都会进位导致这个数的最后第四位+1,实现了向上取整的效果。然后再右移3位,实现了除法的效果。


参考

向上取整

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-5313157.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

【Docker】Docker部署私有仓库的配置及应用

文章目录 一、Docker-registry 搭建本地私有仓库1. Registry 的概念2. Registry 的部署过程二、Docker-harbor 搭建私有仓库1. 什么是Harbor2. Harbor 的特性3. Harbor的构成4. Harbor 的部署过程4.1 安装 harbor4.2 创建项目并进行上传下载4.3 上传镜像到私有仓库4.4 从私有仓…

Java版本spring cloud + spring boot企业电子招投标系统源代码

&#xfeff;项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&…

c++11 标准模板(STL)(std::basic_ifstream)(二)

定义于头文件 <fstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ifstream : public std::basic_istream<CharT, Traits> 类模板 basic_ifstream 实现文件流上的高层输入操作。它将 std::basic_istrea…

xshell连接Windows中通过wsl安装的linux子系统-Ubuntu 22.04

xshell连接Windows中通过wsl安装的linux子系统-Ubuntu 22.04 一、安装linux子系统 1.1、 启动或关闭Windows功能-适用于Linux的Windows子系统 1.2 WSL 官方文档 使用 WSL 在 Windows 上安装 Linux //1-安装 WSL 命令 wsl --install//2-检查正在运行的 WSL 版本&#xff1a;…

2023 云原生编程挑战赛火热报名中!导师解析 Serverless 冷启动赛题

大赛介绍 第四届云原生编程挑战赛&#xff0c;是由阿里云主办&#xff0c;云原生应用平台、天池联合承办的云原生著名品牌赛事。 自 2015 年开始&#xff0c;大赛已经成功举办了八届&#xff0c;并从 2020 年开始升级为首届云原生编程挑战赛&#xff0c;共吸引了超过 53000 支…

千元内新手入门吉他怎么选,VEAZEN费森CLR300和雅马哈F310评测对比,哪一款更出众适合初学者选购?

很多吉他初学者的预算不多&#xff0c;就想要选购平价又好用的吉他&#xff0c;其实这个想法是很正确的。初学者要注意的是这种平价且高性价比的吉他需要仔细挑选&#xff0c;太便宜的吉他保证不了原材料的品质和制作工艺要求&#xff0c;音准没法保证不说&#xff0c;手感差弦…

Mybatis ,Mybatis-plus列表多字段排序,包含sql以及warpper

根据 mybatis 根据多字段排序已经wrapper 根据多字段排序 首先根据咱们返回前端的数据列来规划好排序字段 如下&#xff1a; 这里的字段为返回VO的字段,要转换成数据库字段然后加入到排序中 示例&#xff0c;穿了 surname,cerRank 多字段,然后是倒序 false 首先创建好映射&am…

【网络编程】(TCP流套接字编程 ServerSocket API Socket API 手写TCP版本的回显服务器 TCP中的长短连接)

文章目录 网络编程TCP流套接字编程ServerSocket APISocket APITCP中的长短连接手写TCP版本的回显服务器 网络编程 TCP流套接字编程 TCP提供的API主要是两个类:ServerSocket 和 Socket . TCP不需要一个类来表示"TCP数据报"因为TCP不是以数据报为单位进行传输的.是以…
推荐文章