gpt4 book ai didi

c# - 如何计算整数值范围的位(和字节)宽度

转载 作者:太空宇宙 更新时间:2023-11-03 22:45:23 25 4
gpt4 key购买 nike

我遇到过这样一种情况,我需要计算一个值范围的字节宽度,以便解析在串行通信链路上接收到的字节。使用数据类型的宽度是不可取的,因为我最终会考虑到很多永远不会使用的字节。在我的例子中,该值将在 0 到 4095 之间(即 12 位或两个字节宽),但情况并非总是如此。最大值可能是 255(8 位或一个字节),或者 100.000(17 位或三个字节)。

那么如何计算一个取值范围的位宽/字节宽呢?

最佳答案

方法一

我的解决方案是使用微积分,并反转计算最大范围的方程:maxRange = 2^bitWidth;

给出:bitWidth = log10(maxRange)/log10(2);

或作为 Damien_The_Unbeliever指出关于 Math.Log() 重载:bitWidth = log2(maxRange);

然后四舍五入得到最接近的位,除以 8 再四舍五入,得到最接近的字节。

因此 C# 实现变为:

private int GetByteWidth(long maxValue)
{
int bitLength = (int)Math.Ceiling(Math.Log(ValueRangeMaximum, 2)); // Finding 2^bitLength=ValueRangeMaximum
int byteLength = (int)Math.Ceiling((double)bitLength / 8); // Rounding up to nearest byte
return byteLength;
}

一个更小的方法分离了计算位宽的方法(参见关于计算的部分):

public static int CalculateBitWidthMethod1(int value)
{
int bitWidth = (int)Math.Ceiling(Math.Log(value, 2));
return bitWidth;
}

方法二

来自 web page 的第二种方法那Marc链接到:

public static int CalculateBitWidthMethod2(int value)
{
int bitWidth = 1;
while ((value >>= 1) > 0)
{
bitWidth++;
}
return bitWidth;
}

计算

我创建了一个小型控制台应用程序来测试独立的位宽计算方法。源代码:https://github.com/ohjohnsen/BitWidthCalculations

它计算整数值 1000000 的位宽一千万次,并打印耗时(以毫秒为单位)。

我的结果有点不同,但这些方法的整体性能如下:

  • 方法 1:大约。 810 毫秒。
  • 方法 2:大约。 760 毫秒。

关于c# - 如何计算整数值范围的位(和字节)宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50248163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com