c语言实现向上取整计算方法

目录
  • c语言向上取整计算
  • c语言向上取整的一点技巧

c语言向上取整计算

用整数N 除以 M,要求向上取整数

int n = (N + M -1) / M ;

简化后就是:

int n= (N - 1) / M +1;

最笨的办法

int n = N / M + ((N % M != 0) ? 1 : 0 )

c语言向上取整的一点技巧

做底层或者说驱动开发时,经常会遇到一些硬件限制,比如 STM32 有些寄存器要求 16 bit 访问、32 bit 访问,否则可能引发 Hardfault 中断;再比如擦除 flash 扇区时,会要求整块擦除。这些都是硬件决定的,必须这样做。

假设我们需要 32 bit 访问一个地址 dst 时,如果要写入 10 个字符(两次写入 8 字节,所以需要 3 次才能完全写入),一般我们是怎么做的呢?

char     *str = "0123456789";
uint32_t  len = strlen(str);
uint32_t *src = str; 
uint32_t *dst = 0x20000000; 
 
#define SIZE    (4) 
 
if((len % SIZE) != 0) // 判断是否整除
{
  len = len / SIZE + 1;
}
else
{
  len = len / SIZE;
} 
 
for(int i = 0; i < len; i++)
{
   dst [i] = src [i];  //  32 bit 访问
}

可以看到,上面的写法是最容易想到的一种,也是新手最常写的,但是有经验的老手会怎么写呢?

char     *str = "0123456789";
// 设置 10 字节写入,当然一般情况下是以函数参数的形式传入
uint32_t  len = strlen(str);
uint32_t *src = str; 
uint32_t *dst = 0x20000000; 
 
#define SIZE    (4) 
 
len = (len + SIZE - 1) / SIZE; 
 
for(int i = 0; i < len; i++)
{
   dst [i] = src [i];  //  32 bit 访问
}

len = (len + SIZE - 1) / SIZE;   //重点

就上面一条代码,简单高效直接。

一般看到这种代码,你就会觉得这个作者有水平,不会是新手。

事实上,鱼鹰看了不少开源代码,发现只要会这么操作的,代码水平一般不会太差的。当然不是说写出最上面代码的水平一定不怎么样,就像你不能说一个人写的字很难看,然后断定他作文水平不行是一样的道理。

只是能写出上面代码的,应该可以称之为经验丰富了吧。

继续探讨上面的代码。

你会发现上面的代码非常巧妙,写入长度 + 对齐长度 - 1,这样一来即使写入长度只多一个,也一定会导致最终结果 + 1,这样就巧妙的避免了 if 判断。

而且这条语句没有限制说一定是偶数或奇数,而是任意正整数(0 和 1 除外),可谓巧妙至极。

所以你进行固件升级时,如果要计算一共需要的扇区大小,不如使用该方式吧(当然对于扇区大小不同的不行)。这会让你的同事觉得你很有水平的。

向下取整就简单多了:

len /= SIZE;

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C语言取模取整的深入理解

    目录 一:四大取整 1.1. 0向取整 1.2.  -∞取整( 地板取整) 1.3. +∞取整 1.4. 四舍五入取整 1.5. 例子汇总 二:取模 / 取余 2.1. 概念 2.2. 示例(C和Python) 2.3. 取余和取模一样吗? 2.4. 计算数据同符号 2.5. 计算数据不同符号 2.6. 总结 一:四大取整 1.1. 0向取整 看代码: #include <stdio.h> int main() { //本质是向0取整 int i = -2.9; int j = 2.9; pr

  • C语言编程深入理解取整取余取模问题示例分析

    目录 1. 取整问题 1.0向取整(C语言默认的取整方案) 2.地板取整(向负无穷的方向取整) 3.天花板取整(向+无穷的方向取整) 4.四舍五入取整 汇总例子 2.取模问题  1.余数的定义 2.两种余数 3.为什么会有这种现象? 3.区分取余与取模 1.取余与与取模的本质区别 2.理解链 3.同符号与不同符号 1.同符号: 2.不同符号 1. 取整问题 1.0向取整(C语言默认的取整方案) #include<stdio.h> #include<windows.h> int ma

  • C语言中四种取整方式,取余/取模运算以及负数取模问题详解

    目录 零向取整.负无穷向取整.正无穷向取整.四舍五入取整 总结 零向取整.负无穷向取整.正无穷向取整.四舍五入取整 如果将一个浮点数赋值给整形,只会保存整数位: 这种取整方式为零向取整,C语言默认采用的是这种方式 C语言中也有对应的零向取整函数: 同理还有一种函数是负无穷大取整: 它的取整方案是向负无穷大取整: 有地板取整,当然也有正无穷大取整的函数: 它的取整方式是向正无穷大取整: 最后,还有四舍五入取整的函数: 取模/取余 取模概念: 如果a和d是两个自然数,d非零,可以证明存在两个唯一的整

  • c语言实现向上取整计算方法

    目录 c语言向上取整计算 c语言向上取整的一点技巧 c语言向上取整计算 用整数N 除以 M,要求向上取整数 int n = (N + M -1) / M : 简化后就是: int n= (N - 1) / M +1: 最笨的办法 int n = N / M + ((N % M != 0) ? 1 : 0 ) c语言向上取整的一点技巧 做底层或者说驱动开发时,经常会遇到一些硬件限制,比如 STM32 有些寄存器要求 16 bit 访问.32 bit 访问,否则可能引发 Hardfault 中断:再

  • JavaScript Math.ceil 方法(对数值向上取整)

    JavaScript Math.ceil 方法 Math.ceil 方法用于对数值向上取整,即得到大于或等于该数值的最小整数.语法如下: Math.ceil(x) 参数说明: 参数 说明 x 必需.必须是一个数值. 提示:该方法与 Math.floor 方法正好相反. Math.ceil 方法实例 <script language="JavaScript"> document.write( Math.ceil(0.35) + "<br />"

  • 详解易语言绝对取整和取整的区别

    易语言绝对取整和取整的区别,希望大家都能学懂. 非无私奉献,拒绝看经验不回复,学懂了记得按照下面做: 在底部点击相关按钮,给我投票和点赞. 有心得或者疑问,点击相关按钮反馈. 具体操作请看图. 1.易语言新建一个windows窗口 点击进入代码编辑区 2.我们输入绝对取整() 展开看看 发现只有一个参数 3.在输入取整() 展开看看 发现还是只有一个参数 4.看上去没有什么不同 我们举个例子 我们把这个参数都设为-7.8 5.我们在输入调试输出 用法如图所示 6.然后运行 通过结果发现 绝对取整

  • python ceiling divide 除法向上取整(或小数向上取整)的实例

    向上取整的方法: 方法1: items = 102 boxsize = 10 num_boxes = (items + boxsize - 1) // boxsize 方法2: >>> -(-102 // 10) 11 方法3(浮点数向上取整): from math import ceil print(ceil(10.3)) 11 或 import math math.ceil( x ) 以上这篇python ceiling divide 除法向上取整(或小数向上取整)的实例就是小编分享

  • python对一个数向上取整的实例方法

    python中向上取整可以用ceil函数,ceil函数是在math模块下的一个函数. 向上取整需要用到 math 模块中的 ceil() 方法: >>> import math >>> math.ceil(3.25) 4.0 >>> math.ceil(3.75) 4.0 >>> math.ceil(4.85) 5.0 分别取整数部分和小数部分 有时候我们可能需要分别获取整数部分和小数部分,这时可以用 math 模块中的 modf()

  • psql除法保留小数,实现向上取整和向下取整操作

    在psql中,使用1/4得到的结果是0,因为/它取得是整数,但是有些场景我们是需要保留小数的,还有些场景需要向上取整,或者四舍五入的. 今天就总结下psql保留小数的方法 我用到的方法是类型转换,类似于c中int/int为int类型,而float/int则为float. select round(1::numeric/4::numeric,2) 将除数被除数转换为numeric类型,保留两位小数,此时可以得到 0.25 最近的使用中我是用的是cast转换,如下: MAX(ceil(round(

  • Java两整数相除向上取整的方式详解(Math.ceil())

    目录 前言: 方式一: 添加三目运算符逻辑代码 方式二:使用ceil函数 方式三:其他逻辑 最后总结 附:java向上取整函数Math.ceil() 前言: Java中两个整数相除,如果不能整除,默认是向下取整的.例如:11 除以 3 的结果是 3.然而,某些情况下(eg. 把11个糖果,每3个分一堆,不足三个也分成一堆,可以分几堆?),我们需要向上取整,这样的情况该如果处理呢? 方式一: 添加三目运算符逻辑代码 x / y + (x % y != 0 ? 1 : 0); 这种方法逻辑上很简单,

  • C#编程实现四舍五入、向上及下取整的方法

    本文实例讲述了C#编程实现四舍五入.向上及下取整的方法.分享给大家供大家参考,具体如下: 在处理一些数据时,我们希望能用"四舍五入"法实现,但是C#采用的是"四舍六入五成双"的方法,如下面的例子,就是用"四舍六入五成双"得到的结果: double d1 = Math.Round(1.25, 1);//1.2 double d2 = Math.Round(1.24, 1);//1.2 double d3 = Math.Round(1.26, 1);

  • SQL四舍五入、向下取整、向上取整函数介绍

    round() 遵循四舍五入把原值转化为指定小数位数,如:round(1.45,0) = 1;round(1.55,0)=2 floor()向下取整 如:floor(1.45)= 1,floor(1.55) = 1 ,floor(-1.45)= -2 ,floor(-1.55) = -2 ceiling()向上取整 如:ceiling(1.45) = 2,ceiling(1.55)=2,ceiling(-1.45) = -1,ceiling(-1.55)=-1

  • jquery向上向下取整适合分页查询

    在用ajax进行分页查询时,分页的数目要用到取整函数 <script language="javascript"> var uu=Math.floor(5.36) //向下取整 结果为5 var uu=Math.floor(5.88) //结果为5 Math.ceil(5.33) //向上取整,结果为6 Math.round(5.55) //四舍五入 结果为6 math.round(5.22) //结果为5 </script>

随机推荐