何时按位运算是合适的

Max*_*ich 11 c# algorithm bit-manipulation bit-shift

我知道什么是按位操作的基本前提(虽然会欣赏"for dummies"的解释); 但是我不知道何时使用这种技术是合适的.

我的理解是,较旧的CPU架构可以比其他操作更快地执行按位操作,因此知道如何使用它们是有利的.鉴于此情况已不再适用; 是否仍然适合执行它们,如果是,它的目的和条件是什么?(我对C#语境特别感兴趣,但很高兴收到一般答案)

Ada*_*cer 6

按位运算是快速检查可以在变量上设置的标志的好方法.

下面的示例强调了对Flag枚举使用按位运算以及将bitstuffed字段存储到数据库中的好处.然后可以容易地检查bitstuffed字段以查看它是否包含来自Flag枚举的单个值或值的子集.

例:

一个User数据库表与tinyint所谓的领域Permission.使用通过枚举创建的值填充该字段,其值为2 ^ n.

[Flags]
public enum Permission : byte
{
    None = 0,
    ManageUsers = 1 << 0,
    CreateOrders = 1 << 1,
    PurchaseEquipment = 1 << 2,
    CancelOrders = 1 << 3,
}
Run Code Online (Sandbox Code Playgroud)

除了用于指定枚举中的值的按位运算(在编译时完成)之外,您还可以使用枚举来检查数据库中的Permission字段是否包含可能值的任何子集.从数据库方面,您可以将值填充到单个字段中 - 无需为每个权限创建列,并且在代码方面,您可以轻松地检查值.

bitstuffing示例(Grant ManageUsers和CreateOrders):

Permission userPermissions = Permission.ManageUsers | Permission.CreateOrders;
Run Code Online (Sandbox Code Playgroud)

权限检查示例:

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


Ric*_*key 5

问题不在于按位运算比整数运算更快(尽管它们通常是这样),而是它们是用于不同目的的不同运算.

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