什么是按位运算符?

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

我正在阅读一篇关于JavaScript的文章,它显然支持按位操作。 我不断地看到这个地方提到的这个操作,我试着弄清楚它究竟是什么,但我似乎根本就没有得到它。 那么他们是什么? 清晰的例子会很棒! :d

还有几个问题 - 按位操作的实际应用是什么? 你什么时候可以使用它们?


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

使用标志时,我使用了很多按位操作。 例如,如果要将一系列标志传递给某个操作(例如,File.Open,同时启用了读取模式和写入模式),则可以将它们作为单个值传递。 这是通过将每个可能的标志分配给一个bitset(byte,short,int或long)来完成的。 例如:

 Read: 00000001
Write: 00000010

所以如果你想通过读写,你会传递(READ | WRITE),然后将两者结合到一起

00000011

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

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

哪些检查

00000011 &
00000001

返回

00000001

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

您可以使用XOR切换各种位。 我使用这个标志来指定方向输入(上,下,左,右)。 例如,如果精灵正在水平移动,并且我希望它转向:

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

在这种情况下,我只需将(LEFT | RIGHT)XOR当前值与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

0xFF与11111111相同。因此,对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)

值得注意的是,被列为其他答案的单比特真值表一次只能处理一个或两个输入比特。 当你使用整数时会发生什么,例如:

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”操作,每个列一个。

我提到这一点是因为我仍然记得有这个“AHA!” 当我在多年前了解到这一点时。


按位运算符是一次只能工作一点的运算符。

AND仅当它的两个输入都是1时为1。

如果一个或多个输入为1,则OR为1。

仅当其中一个输入为1时,XOR才为1。

只有当其输入为0时,NOT才是1。

这些可以最好地描述为真值表。 输入可能性位于顶部和左侧,结果位是两个输入的交点处显示的四个值之一(在NOT的情况下为两个,因为它只有一个输入)。

AND|0 1      OR|0 1
---+----    ---+----
  0|0 0       0|0 1
  1|0 1       1|1 1

XOR|0 1     NOT|0 1
---+----    ---+---
  0|0 1        |1 0
  1|1 0

一个例子是,如果你只想要一个整数的低4位,你把它与15(二进制1111)如此:

    203: 1100 1011
AND  15: 0000 1111
------------------
 IS  11: 0000 1011
链接地址: http://www.djcxy.com/p/9983.html

上一篇: What are bitwise operators?

下一篇: Is it good practice to use the xor operator for boolean checks?