按位操作何时适合
我知道什么是按位操作的基本前提(虽然会赞赏“对于傻瓜”的解释); 但是我不知道什么时候适合使用这种技术。
我的理解是,较早的CPU架构可以比其他操作更快地执行按位操作,因此知道如何使用它们是有利的。 鉴于这不再是这种情况; 执行它们是否合适,如果是这样,为了什么目的和在什么条件下? (我特别感兴趣的是C#的上下文,但很高兴收到一般答案)
按位操作是快速检查可能在变量上设置的标志的好方法。
下面的示例着重使用在按位运算的好处Flag
枚举以及存储bitstuffed场到数据库中。 然后可以很容易地检查bitstuffed字段,看看它是否包含来自Flag
枚举的单个值或子集值。
例:
带有称为Permission
的tinyint
字段的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