gpt4 book ai didi

c# - 按位运算符与 C# 中位操作的 .NET 抽象

转载 作者:行者123 更新时间:2023-11-30 19:18:30 24 4
gpt4 key购买 nike

我正在尝试获得使用 C#.NET 处理位的基本技能。我昨天发布了一个示例,其中包含一个需要位操作的简单问题,这让我了解到有两种主要方法 - 使用 bitwise operators 或使用 .NET 抽象,例如 BitArray(如果有更多内置工具可用于处理 .NET 中 BitArray 以外的位,请告诉我,如果有,如何找到它们的更多信息?)。

我知道 按位运算符 工作得更快,但使用 BitArray 对我来说更容易,但我真正试图避免的一件事是学习不良做法。尽管我个人偏好 .NET 抽象,但我想知道我实际上更适合在实际程序中学习和使用。考虑到这一点,我很想认为 .NET 抽象并没有那么糟糕,毕竟一定有理由存在,也许作为初学者,学习抽象并在以后通过低级操作提高我的技能更为自然,但这只是随机的想法。

最佳答案

这真的取决于你用它做什么。我会说当速度更受关注时使用按位运算,因为它们的开销要少得多。否则,BitArray 应该没问题。相关的主要开销是函数调用和对您可以执行的“技巧”的一些限制。

例如,如果您想要在位 0、3 或 4 设置为值时执行某些操作:

if((value & 0b11001)>0) //not sure this is valid syntax, but you get the idea
{
//do stuff
}

因为整数是原生 CLR 类型,几乎直接转换为 3 个原生操作码,movandcmp

对于 BitArray,我认为最有效的方式是这样的:

if(value[0] || value[3] || value[4])
{
//...
}

其中(假设不是 JIT),这等于最多 3 个复杂度较低的函数调用。从 BitArray 的后备整数(我假设)中获取位值的最简单方法如下所示:

bool GetBit(int which)
{
return value & (1 << which)>0;
}

这基本上意味着它相当于慢了大约 2 倍只有一位对于这个 super 简单的例子,这意味着慢了大约 6 倍,因为我们正在检查 3 位。

而且对于 BitArrays,副本可能更昂贵,因为它们不是 native CLR 类型。我怀疑这种开销在很大程度上被 JIT 消除了,但仍然需要考虑,尤其是在以紧凑型框架为目标时。

基本上,只有在您永远不需要对它们执行复杂的按位运算时才使用 BitArray。

注意:您还可以使用混合方法在整数和 BitArray 之间进行转换,但这也会产生相当大的开销。

关于c# - 按位运算符与 C# 中位操作的 .NET 抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12409830/

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