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

发布于:2024-12-06 ⋅ 阅读:(95) ⋅ 点赞:(0)

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个字节来存放


网站公告

今日签到

点亮在社区的每一天
去签到