按位操作何时适合

我知道什么是按位操作的基本前提(虽然会赞赏“对于傻瓜”的解释); 但是我不知道什么时候适合使用这种技术。

我的理解是,较早的CPU架构可以比其他操作更快地执行按位操作,因此知道如何使用它们是有利的。 鉴于这不再是这种情况; 执行它们是否合适,如果是这样,为了什么目的和在什么条件下? (我特别感兴趣的是C#的上下文,但很高兴收到一般答案)


按位操作是快速检查可能在变量上设置的标志的好方法。

下面的示例着重使用在按位运算的好处Flag枚举以及存储bitstuffed场到数据库中。 然后可以很容易地检查bitstuffed字段,看看它是否包含来自Flag枚举的单个值或子集值。

例:

带有称为Permissiontinyint字段的User数据库表。 该字段使用由值为2 ^ n的枚举创建的值填充。

[Flags]
public enum Permission : byte
{
    None = 0,
    ManageUsers = 1 << 0,
    CreateOrders = 1 << 1,
    PurchaseEquipment = 1 << 2,
    CancelOrders = 1 << 3,
}

除了使用按位操作指定枚举中的值(在编译时完成)之外,还可以使用枚举检查数据库中的Permission字段是否包含可能值的任何子集。 从数据库方面来说,您可以将值填充到单个字段中 - 无需为每个权限设置一列,而在代码方面,您可以通过简单的方法检查值。

示例bitstuffing(授予ManageUsers和CreateOrders):

Permission userPermissions = Permission.ManageUsers | Permission.CreateOrders;

示例权限检查:

public bool HasPermissions(Permission userPermissions, Permission permissionsToCheckFor)
{
    return permissionsToCheckFor == Permission.None ? 
        false : 
        (userPermissions & permissionsToCheckFor) == permissionsToCheckFor;
}

问题不在于按位操作比整数操作快(尽管通常是),而是因为不同的目的它们是不同的操作。

从概念上讲字节和短裤和int为位和位运算符的真正小数组布尔数组运算符。 现在在C#中,按位运算符主要用于[Flags]枚举和GetHashCode计算,但是有无穷无尽的方式可以使用位数组。


你是正确的,只是因为语言给你按位操作,所以你不应该仅仅因为你可以使用它们。 我看到人们在使用简单的布尔运算符时使用按位运算符,而这不是他们的目的。

在处理数据结构的数据块不与字节边界对齐时,按位运算符很有用。 通常,这是在带宽(或一般内存占用)非常重要时完成的。 我使用RTP视频流媒体软件,并且按位操作既用于读取/构建RTP传输数据包,也用于读取视频编解码器流,其通常使用比特而非字节进行编码。

链接地址: http://www.djcxy.com/p/72497.html

上一篇: When are bitwise operations appropriate

下一篇: C# bitwise shift on ushort (UInt16)