下面的位运算符在现实世界中有哪些用例?
和 XOR 不 或 左/右转
下面的位运算符在现实世界中有哪些用例?
和 XOR 不 或 左/右转
当前回答
Bitwise operators are useful for looping arrays which length is power of 2. As many people mentioned, bitwise operators are extremely useful and are used in Flags, Graphics, Networking, Encryption. Not only that, but they are extremely fast. My personal favorite use is to loop an array without conditionals. Suppose you have a zero-index based array(e.g. first element's index is 0) and you need to loop it indefinitely. By indefinitely I mean going from first element to last and returning to first. One way to implement this is:
int[] arr = new int[8];
int i = 0;
while (true) {
print(arr[i]);
i = i + 1;
if (i >= arr.length)
i = 0;
}
这是最简单的方法,如果你想避免if语句,你可以像这样使用模方法:
int[] arr = new int[8];
int i = 0;
while (true) {
print(arr[i]);
i = i + 1;
i = i % arr.length;
}
这两种方法的缺点是,模运算符是昂贵的,因为它在整数除法后寻找余数。第一个方法在每次迭代中运行if语句。然而,如果你的数组长度是2的幂,你可以很容易地生成一个像0 ..长度- 1,使用&(位和)操作符,如I & Length。知道了这些,上面的代码就变成了
int[] arr = new int[8];
int i = 0;
while (true){
print(arr[i]);
i = i + 1;
i = i & (arr.length - 1);
}
下面是它的工作原理。在二进制格式中,所有2的幂减去1的数都只用1表示。例如,二进制的3是11,7是111,15是1111,等等,你懂的。现在,如果你用任意一个数对一个只由1组成的二进制数,会发生什么?假设我们这样做:
num & 7;
如果num小于或等于7,那么结果将是num,因为每个加1的&-ed就是它自己。如果num大于7,在&操作期间,计算机将考虑7的前导零,当然,在&操作后,这些前导零将保持为零,只有后面的部分将保留。比如二进制的9和7
1001 & 0111
结果将是0001,它是十进制的1,并定位数组中的第二个元素。
其他回答
我不认为这是按位计算的,但是ruby的Array通过普通整数按位操作符定义了集合操作。因此[1,2,4]&[1,2,3]# =>[1,2]。对于a ^ b# =>集差值和| b# =>并集也是如此。
我曾在一些游戏开发书籍中看到它是一种更有效的乘除方法。
2 << 3 == 2 * 8
32 >> 4 == 32 / 16
大约三分钟前,我刚刚使用了位异或(^)来计算与PLC串行通信的校验和…
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).
这些只是我最先想到的几个例子——这不是一个详尽的清单。
还没人提到过收藏。有时您有一个较小的可能值集合,比如只有10或20个可能值,您希望将其中一些值保存在一个集合中。当然,您可以使用常规的Set实现,它很可能使用支持哈希表。但由于可能值的集合是如此之小,这实际上只是浪费时间和空间。相反,您可以将集合存储在单个int或长值中,这正是java EnumSet所做的,如果我没记错的话。