什么是按位运算符?

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

我正在阅读一篇关于JavaScript的文章,它显然支持按位操作。我一直在一些地方看到这个操作,我试图阅读它来弄清楚它到底是什么,但我似乎根本没有理解它。那么它们是什么呢?明确的例子会很棒!:D

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


答案 1

由于没有人提出为什么这些是有用的主题:

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

 Read: 00000001
Write: 00000010

因此,如果要传递读取和写入,则会通过(读取|WRITE),然后将两者组合成

00000011

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

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

哪个检查

00000011 &
00000001

返回

00000001

它不是 0,因此该标志指定了 READ。

您可以使用 XOR 切换各种位。我在使用标志指定方向输入(向上,向下,向左,向右)时使用它。例如,如果一个子画面水平移动,而我希望它转动:

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

我只是用(左|右),在这种情况下,它将关闭左键和右键打开。

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

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

0xFF与 相同。所以从本质上讲,对于Red来说,你会这样做:11111111

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)

答案 2

值得注意的是,与其他答案列出的单位真值表一次只能处理一个或两个输入位。使用整数时会发生什么情况,例如:

int x = 5 & 6;

答案在于每个输入的二进制展开:

  5 = 0 0 0 0 0 1 0 1
& 6 = 0 0 0 0 0 1 1 0
---------------------
      0 0 0 0 0 1 0 0

每列中的每对位都通过“AND”函数运行,以在底线上给出相应的输出位。所以上面表达式的答案是4。CPU(在此示例中)并行执行了 8 个单独的“AND”操作,每列一个。

我之所以提到这一点,是因为我仍然记得多年前当我了解到这一点时,我有过“啊哈!”的时刻。