向上取整再分析

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

  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.mzph.cn/news/15649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

八、用 ChatGPT 帮助排查生产事故

目录 一、实验介绍 二、背景 三、故障排查概述 3.1 生产环境故障排查涉及的角色

07mysql查询语句之子查询

#1.查询和Zlotkey相同部门的员工姓名和工资 SELECT last_name,salary FROM employees WHERE department_id IN ( SELECT department_id FROM employees WHERE last_name Zlotkey ); #2.查询工资比公司平均工资高的员工的员工号&#xff0…

某拍房数据采集

某拍房数据采集 某拍房数据采集声明1.逆向目标2.寻找加密位置3.分析加密参数4.python代码书写 某拍房数据采集 声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的…

flask创建数据库连接池

flask创建数据库连接池 在Python中&#xff0c;您可以使用 Flask-SQLAlchemy 这个扩展来创建一个数据库连接池。Flask-SQLAlchemy 是一个用于 Flask 框架的 SQLAlchemy 操作封装&#xff0c;实现了 ORM(Object Relational Mapper)。ORM 主要用于将类与数据库中的表建立映射关系…

接口自动化测试-Jmeter+ant+jenkins实战持续集成(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、下载安装配置J…

uniapp实现带参数二维码

view <view class"canvas"><!-- 二维码插件 width height设置宽高 --><canvas canvas-id"qrcode" :style"{width: ${qrcodeSize}px, height: ${qrcodeSize}px}" /></view> script import uQRCode from /utils/uqrcod…

Stable-Diffusion-Webui部署SDXL0.9报错参数shape不匹配解决

问题 已经在model/stable-diffusion文件夹下放进去了sdxl0.9的safetensor文件&#xff0c;但是在切换model的时候&#xff0c;会报错model的shape不一致。 解决方法 git pullupdate一些web-ui项目就可以&#xff0c;因为当前项目太老了&#xff0c;没有使用最新的版本。

Kubernetes集群管理 —追踪 Kubernetes 系统组件、代理

一、追踪 Kubernetes 系统组件 特性状态&#xff1a; Kubernetes v1.27 [beta] 系统组件追踪功能记录各个集群操作的时延信息和这些操作之间的关系。 Kubernetes 组件基于 gRPC 导出器的 OpenTelemetry 协议 发送追踪信息&#xff0c;并用 OpenTelemetry Collector 收集追踪…

【【51单片机AD/DA的分析】】

51单片机AD/DA的分析 看似单片机实验&#xff0c;其实是要学好数电 模数转换 与 数模转换 运算放大器 DA的转换就是利用运算放大器实现的 输出电压v0-(D7~D0)/256 x (VrefxRfb)/R D7~D0 就是我们控制的按键看输入多少 然后再划分256份 Vref是我们设置的一个基准电压 PWM 这种…

用牛鲨水豚赚取SUI的机会又来喽,500万SUI奖励等你来领!

刚刚结束的第一轮Bullshark Quest真是一次惊心动魄的体验&#xff01;我们非常感激社区成员的积极参与以及对Sui生态系统的关注。此轮获奖者的奖励已于美国时间2023年7月28日&#xff0c;在Quest门户网站上公布。参与者点击“Claim”即可将奖励领取至Sui钱包。请注意&#xff0…

Opencv Win10+Qt+Cmake 开发环境搭建

文章目录 一.Opencv安装二.Qt搭建opencv开发环境 一.Opencv安装 官网下载Opencv安装包 双击下载的软件进行解压 3. 系统环境变量添加 二.Qt搭建opencv开发环境 创建一个新的Qt项目(Non-Qt Project) 打开创建好的项目中的CMakeLists.txt&#xff0c;添加如下代码 # openc…

TC3XX - MCAL知识点(十三):IOM EB-tresos配置说明及代码浅析

目录 1、概述 2、EB-tresos配置 2.1、配置目标 2.2、Port配置 2.3、SMU配置 2.3.1、SmuCoreAlarmGlobalConfig

neo4j教程-Cypher操作

Cypher基础操作 Cypher是图形存储数据库Neo4j的查询语言&#xff0c;Cypher是通过模式匹配Neo4j数据库中的节点和关系&#xff0c;从而对数据库Neo4j中的节点和关系进行一系列的相关操作。 下面&#xff0c;通过一张表来介绍一下常用的Neo4j操作命令及相关说明&#xff0c;具…

docker 部署 mysql8.0 无法访问

文章目录 &#x1f5fd;先来说我的是什么情况&#x1fa81;问题描述&#x1fa81;解决方法&#xff1a;✔️1 重启iptables✔️2 重启docker &#x1fa81;其他有可能连不上的原因✔️1 客户端不支持caching_sha2_password的加密方式✔️2 my.conf 配置只有本机可以访问 &#…

销售易和管易云接口打通对接实战

销售易和管易云接口打通对接实战 来源系统:销售易 销售易CRM支持企业从营销、销售到服务的全流程自动化业务场景&#xff0c;创新性地利用AI、大数据、物联网等新型互联网技术打造双中台型CRM&#xff1b;既能帮助B2B企业连接外部经销商、服务商、产品以及最终用户&#xff0c;…

虚拟局域网VLAN

概述 广播域 使用一个或多个以太网交换机互连接起来的交互式以太网&#xff0c;其所有站点都属于同一个广播域&#xff0c;随着交换式以太网规模的扩大&#xff0c;广播域响应扩大&#xff0c;从而形成一个巨大的广播域。 但是巨大的广播域会带来很多的弊端&#xff1a; 广…

redis 高级篇4 分布式锁

一 redis架构图 1.1 redis的架构图 1.2 分布式锁满足条件 1.独占性&#xff1b;2.高可用&#xff1b;3.防死锁&#xff1b;4.不乱抢&#xff1b;5.重入性 二 分布式锁的案例情况 2.1 分布式锁1:单机分布式部署 描述&#xff1a; 使用lock锁和synchronized&#xff0c;单机…

在海外如何让应用在Google Play上得到推荐

在Google Play商店中获得推荐&#xff0c;可以为应用程序带来额外的知名度。 1、应用程序的质量。 确保我们的应用是高质量的并且具有最新的Google Play功能和更新。另外需要应用程序在所有Android设备上兼容。需要将应用程序本地化&#xff0c;从而满足世界各地用户的需求&am…

HDFS中namenode安全模式

HDFS中namenode安全模式 安全模式的现象探究step1step2step3step4 安全模式的概述控制进入时间和离开条件安全模式自动进入离开安全模式手动进入离开 安全模式的现象探究 step1 HDFS集群在停机状态下&#xff0c;使用hdfs -daemon命令逐个进程启动集群&#xff0c;观察现象首…

【Kaggle】Kaggle数据集如何使用命令语句下载?

一、Kaggle数据集如何下载 1.1 问题的起因 最近看到了 Google 组织的 Kaggle 比赛&#xff0c;想自己试一下&#xff0c;但是数据集太大了&#xff0c;将近有370G的数据。直接下载的话&#xff0c;网速太慢&#xff0c;可能要下载3-4天&#xff0c;所以萌生了用命令语句下载的…