下面的位运算符在现实世界中有哪些用例?
和 XOR 不 或 左/右转
下面的位运算符在现实世界中有哪些用例?
和 XOR 不 或 左/右转
当前回答
一个非常具体的例子,但我用它们让我的数独求解器运行得更快(我和一个朋友进行了比赛)
每一列、行和3x3都表示为一个无符号整数,当我设置数字时,我会为相关列、行和3x3平方中设置的数字标记适当的位。
这样就很容易看到我可以在给定的正方形中放置什么可能的数字,因为我将右边的列、行和3x3的正方形放在一起,然后不这样做,留下一个表示给定位置可能的合法值的掩码。
希望大家能理解。
其他回答
还没人提到过收藏。有时您有一个较小的可能值集合,比如只有10或20个可能值,您希望将其中一些值保存在一个集合中。当然,您可以使用常规的Set实现,它很可能使用支持哈希表。但由于可能值的集合是如此之小,这实际上只是浪费时间和空间。相反,您可以将集合存储在单个int或长值中,这正是java EnumSet所做的,如果我没记错的话。
它在sql关系模型中也很方便,假设你有以下表:BlogEntry, BlogCategory
传统上,你可以使用BlogEntryCategory表在它们之间创建一个n-n关系 或者当没有那么多的BlogCategory记录时,你可以在BlogEntry中使用一个值来链接到多个BlogCategory记录,就像你会用标记的枚举做的那样, 在大多数RDBMS中,也有一个非常快速的操作符来选择'标记'列…
我不认为这是按位计算的,但是ruby的Array通过普通整数按位操作符定义了集合操作。因此[1,2,4]&[1,2,3]# =>[1,2]。对于a ^ b# =>集差值和| b# =>并集也是如此。
Bit fields (flags) They're the most efficient way of representing something whose state is defined by several "yes or no" properties. ACLs are a good example; if you have let's say 4 discrete permissions (read, write, execute, change policy), it's better to store this in 1 byte rather than waste 4. These can be mapped to enumeration types in many languages for added convenience. Communication over ports/sockets Always involves checksums, parity, stop bits, flow control algorithms, and so on, which usually depend on the logic values of individual bytes as opposed to numeric values, since the medium may only be capable of transmitting one bit at a time. Compression, Encryption Both of these are heavily dependent on bitwise algorithms. Look at the deflate algorithm for an example - everything is in bits, not bytes. Finite State Machines I'm speaking primarily of the kind embedded in some piece of hardware, although they can be found in software too. These are combinatorial in nature - they might literally be getting "compiled" down to a bunch of logic gates, so they have to be expressed as AND, OR, NOT, etc. Graphics There's hardly enough space here to get into every area where these operators are used in graphics programming. XOR (or ^) is particularly interesting here because applying the same input a second time will undo the first. Older GUIs used to rely on this for selection highlighting and other overlays, in order to eliminate the need for costly redraws. They're still useful in slow graphics protocols (i.e. remote desktop).
这些只是我最先想到的几个例子——这不是一个详尽的清单。
我在为CMS实现安全模型时使用了按位操作。如果用户属于适当的组,就可以访问它的页面。一个用户可以在多个组中,因此我们需要检查用户组和页面组之间是否有交集。因此,我们为每个组分配了一个唯一的2次方标识符,例如:
Group A = 1 --> 00000001
Group B = 2 --> 00000010
Group C = 3 --> 00000100
我们将这些值一起OR,并将值(作为单个int)存储在页面中。例如,如果一个页面可以被a组和B组访问,我们存储值3(二进制是00000011)作为页面访问控制。同样,我们将or组标识符的值存储给用户,以表示用户所在的组。
因此,要检查给定用户是否可以访问给定页面,只需将这些值与运算在一起,并检查该值是否非零。这是非常快的,因为这个检查是在一条指令中实现的,没有循环,没有数据库往返。