当前位置: 首页 > news >正文

C# 向上取整多种实现方法

1.使用 Math.Ceiling 方法
在 C# 中,可以利用 System.Math 类下的 Math.Ceiling 方法来实现向上取整。它接受一个 double 或 decimal 类型的参数,并返回大于或等于该参数的最小整数(以 double 或 decimal 类型表示)。示例如下:

double num = 3.14;
double result = Math.Ceiling(num);
Console.WriteLine(result); 
// 输出 4,将3.14向上取整得到4

2.自定义算法实现(针对整数除法的向上取整情况)
对于类似计算位组转字节组时确定字节数组长度这种通过除法并向上取整的情况(已知总位数除以 8 向上取整得到字节数),可以用以下代码逻辑实现:

int totalBits = 13;
int byteCount = (totalBits - 1) / 8 + 1;
Console.WriteLine(byteCount); 
// 输出 2,13位需要2个字节来存放,实现了向上取整的效果

 示例:

using System;
using System.Collections;class Program
{static void Main(){byte[] binarylist = { 0x01, 0x02 };  // 初始字节数组示例// 转化为位组BitArray myBit = new BitArray(binarylist);int index = 3;  // 假设要更新第3位(索引从0开始算)bool value = true;  // 将其设为1// 更新指定位数的二进制值myBit.Set(index, value);// 再转化为字节组byte[] Newbyte = new byte[(myBit.Length - 1) / 8 + 1];myBit.CopyTo(Newbyte, 0);// 输出新的字节数组内容(以十六进制形式方便查看)foreach (byte b in Newbyte){Console.Write(b.ToString("X2") + " ");}}
}

3. 使用 DivideAndRoundUp 函数

你可以封装一个通用的向上取整方法,这对于一些特定场景,尤其是需要经常进行类似操作时会非常有用。比如计算需要多少页面、块、部分等。加上 除数减 1 的值来实现向上取整。这种做法确保了除法运算在遇到余数时,会正确地向上取整

public static int DivideAndRoundUp(int dividend, int divisor){ return (dividend + divisor - 1) / divisor; }

这个函数接受两个整数参数,并返回向上取整的结果。比如,用它来计算字节数:

int totalBits = 13; 
int byteCount = DivideAndRoundUp(totalBits, 8); 
Console.WriteLine(byteCount); // 输出 2,13位需要2个字节来存放

4. 使用 Math.Floor 配合加1

另一个方法是使用 Math.Floor 方法,然后加1,这种方法适用于浮动类型(doubledecimal)的向上取整操作。

double num = 3.14; 
// 输出 4,3.14向上取整得到4
double result = Math.Floor(num + 0.999999999999); 
Console.WriteLine(result); 

这个方法通过加上一个很小的数(如 0.999999999999)将数值推到下一个整数,从而实现类似向上取整的效果。

5. 使用 int 类型的条件表达式

对于简单的除法和向上取整场景(如整数除法时),还可以使用条件表达式来判断是否需要加1。具体实现可以通过比较余数来进行判断:

int totalBits = 13; 
int byteCount = (totalBits % 8 == 0) ? (totalBits / 8) : (totalBits / 8 + 1);
Console.WriteLine(byteCount); // 输出 2,13位需要2个字节来存放

6. 使用 Bitwise Operations (位运算)

对于特定的场景(如字节对齐),可以通过位运算实现向上取整,这种方式相对高效,但通常适用于对内存对齐和性能有要求的场合。

例如,使用位运算来将总位数向上取整到最接近的字节数:

int totalBits = 13;int byteCount = (totalBits + 7) >> 3; // 右移3位,相当于除以8并向上取整 
Console.WriteLine(byteCount); // 输出 2,13位需要2个字节来存放

http://www.lryc.cn/news/498122.html

相关文章:

  • Elastic Cloud Serverless:深入探讨大规模自动扩展和性能压力测试
  • 新一代零样本无训练目标检测
  • es 3期 第13节-多条件组合查询实战运用
  • 全局token验证
  • 实时美颜技术详解:美颜SDK与直播APP开发实践
  • 电子应用设计方案-41:智能微波炉系统方案设计
  • P5736 【深基7.例2】质数筛
  • 数据结构初阶1 时间复杂度和空间复杂度
  • E130 PHP+MYSQL+动漫门户网站的设计与实现 视频网站系统 在线点播视频 源码 配置 文档 全套资料
  • OSCP - Proving Grounds - Fanatastic
  • ArcMap 分享统计点要素、路网、降雨量等功能操作
  • 概率论——假设检验
  • 爬虫项目练手
  • C程序设计:解决Fibonacci.数列问题
  • 35页PDF | 元数据与数据血缘落地实施(限免下载)
  • Lua元表和元方法的使用
  • 基于Pyhton的人脸识别(Python 3.12+face_recognition库)
  • Spring Boot+Netty
  • LCR 023. 相交链表
  • Linux命令行下载工具
  • 期末复习-Hadoop名词解释+简答题纯享版
  • 嵌入式Linux无窗口系统下搭建 Qt 开发环境
  • C#基础教程
  • Alibaba EasyExcel 导入导出全家桶
  • Spring Cloud + MyBatis Plus + GraphQL 完整示例
  • uni-app简洁的移动端登录注册界面
  • LongVU:用于长视频语言理解的空间时间自适应压缩
  • Elasticsearch数据迁移(快照)
  • Linux Cgroup学习笔记
  • 百问FB显示开发图像处理 - PNG图像处理