boolean - 什么是位运算符?

标签 boolean language-agnostic bitwise-operators boolean-logic

我只是为了好玩而编写代码,并没有在学术或专业环境中真正深入研究它,所以像这些按位运算符这样的东西真的让我失望了。

我正在阅读一篇关于 JavaScript 的文章,它显然支持按位运算。我经常看到很多地方提到这个操作,并且我已经尝试阅读以弄清楚它到底是什么,但我似乎根本不明白。那么它们是什么?清楚的例子会很棒! :D

还有几个问题 - 按位运算有哪些实际应用?您什么时候可以使用它们?

最佳答案

因为没有人提出为什么这些有用的主题:

在处理标志时,我经常使用按位运算。例如,如果您想将一系列标志传递给操作(例如,File.Open(),同时启用读取模式和写入模式),您可以将它们作为单个值传递。这是通过为每个可能的标志分配它在位集中(字节、短、整型或长)中自己的位来实现的。例如:

 Read: 00000001
Write: 00000010

所以如果你想传递读和写,你会传递 (READ | WRITE) 然后将两者组合成

00000011

然后可以在另一端解密,例如:

if ((flag & Read) != 0) { //...

哪个检查

00000011 &
00000001

返回

00000001

它不是 0,所以该标志确实指定了 READ。

您可以使用 XOR 来切换各个位。我在使用标志指定方向输入(上、下、左、右)时使用了它。例如,如果一个 sprite 正在水平移动,我希望它转身:

     Up: 00000001
   Down: 00000010
   Left: 00000100
  Right: 00001000
Current: 00000100

在这种情况下,我只是将当前值与 (LEFT | RIGHT) 进行异或,这将关闭 LEFT 并打开 RIGHT。

位移位在多种情况下很有用。

x << y

相同

x * 2y

如果您需要快速乘以 2 的幂,但要注意将 1 位移到最高位 - 这会使数字为负,除非它是无符号的。在处理不同大小的数据时,它也很有用。例如,从四个字节中读取一个整数:

int val = (A << 24) | (B << 16) | (C << 8) | D;

假设 A 是最高有效字节,D 是最低有效字节。它最终会是:

A = 01000000
B = 00000101
C = 00101011
D = 11100011
val = 01000000 00000101 00101011 11100011

颜色通常以这种方式存储(最高有效字节被忽略或用作 Alpha):

A = 255 = 11111111
R = 21 = 00010101
G = 255 = 11111111
B = 0 = 00000000
Color = 11111111 00010101 11111111 00000000

要再次找到值,只需将位向右移动直到它位于底部,然后屏蔽掉剩余的高位位:

Int Alpha = Color >> 24
Int Red = Color >> 16 & 0xFF
Int Green = Color >> 8 & 0xFF
Int Blue = Color & 0xFF

0xFF11111111 相同。所以基本上,对于 Red,你会这样做:

Color >> 16 = (filled in 00000000 00000000)11111111 00010101  (removed 11111111 00000000)
00000000 00000000 11111111 00010101 &
00000000 00000000 00000000 11111111 =
00000000 00000000 00000000 00010101 (The original value)

关于boolean - 什么是位运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/276706/

相关文章:

r - 逻辑双重强制的基本原理是什么?

c - (重新)熟悉一门语言的有效方法是什么?

c - 查找数字的 n 位长度 2s 补码表示

java - 为什么 getRGB() 方法是这样写的?是否有其他方法来编写 getRGB() 方法?

java编译错误: method inside method

python - 使用相同的 boolean 值初始化列表

java - 在java中处理 boolean 结果集

language-agnostic - 用于搜索表单的 seo

algorithm - 如何有效地分割单元格中的二维空间,使每个单元格最多包含 K 个点?

c - C中位运算符的应用及其效率?