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

 更新时间:2022年07月22日 09:47:22   作者:飞鸟真人  
这篇文章主要介绍了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;

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

相关文章

  • C语言构建动态数组完整实例

    C语言构建动态数组完整实例

    这篇文章主要介绍了C语言构建动态数组完整实例,帮助读者加深对C语言数组及指针的理解,需要的朋友可以参考下
    2014-07-07
  • QT5实现TTS文本语音朗读功能

    QT5实现TTS文本语音朗读功能

    TTS 语音朗读 是开发中常用的功能,Qt已经给封装完成,我们只需要调用即可,本文就为大家介绍了QT5如何调用实现文本朗读功能的,需要的可以参考一下
    2023-05-05
  • C语言中四种取整方式,取余/取模运算以及负数取模问题详解

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

    这篇文章主要介绍了C语言中四种取整方式及负数取模问题,包括了算法的分析与改进,是很多程序设计竞赛中常见的算法,需要的朋友可以参考下
    2021-09-09
  • C语言数据的存储超详细讲解下篇浮点型在内存中的存取

    C语言数据的存储超详细讲解下篇浮点型在内存中的存取

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
    2022-04-04
  • C++中拷贝构造函数的总结详解

    C++中拷贝构造函数的总结详解

    深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝
    2013-09-09
  • C++实现哈夫曼编码

    C++实现哈夫曼编码

    这篇文章主要为大家详细介绍了C++实现哈夫曼编码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • QT编写tcp通信工具(Server端)

    QT编写tcp通信工具(Server端)

    这篇文章主要为大家详细介绍了QT编写tcp通信工具,一个类似网上常见的网络调试工具,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 一般函数指针和类的成员函数指针深入解析

    一般函数指针和类的成员函数指针深入解析

    以下是对一般函数指针和类的成员函数指针进行了介绍。需要的朋友可以过来参考下
    2013-08-08
  • C语言目标文件的详细讲解

    C语言目标文件的详细讲解

    最近正在阅读关于C语言的库,但是我还没有find关于目标文件的解释,这篇文章主要给大家介绍了C语言目标文件的详细讲解,文中介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • 关于C++中由于字节对齐引起内存问题定位分析

    关于C++中由于字节对齐引起内存问题定位分析

    前几天遇到一个稀奇古怪的问题,在创建对象的时候程序异常退出,查找代码发现结构体数组问题,最终把问题简化得到解决方法,下面小编把我的问题及解决方案分享到脚本之家平台供大家参考下
    2021-06-06

最新评论