什么是位运算符?

我写代码只是为了好玩,并没有真正钻研过学术或专业设置,所以像这些按位运算符的东西真的逃脱了我。

我在读一篇关于 JavaScript 的文章,它显然支持按位运算。我一直在某些地方看到有人提到这个手术,我试着读一读,想弄清楚到底是什么手术,但我似乎一点也不明白。那它们是什么?明确的例子将是伟大的!校对: D

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

23759 次浏览

这些是 JavaScript 支持的按位运算符:

  • op1 & op2—— AND运算符比较两个位,如果两个位都是1,则结果为1; 否则返回0。

  • op1 | op2—— OR运算符比较两位,如果两位互补,则生成1的结果; 否则返回0。

  • op1 ^ op2—— EXCLUSIVE-OR运算符比较两位,如果其中一位为1,则返回1; 如果两位均为0或1,则返回0。

  • ~op1—— COMPLEMENT运算符用于反转操作数的所有位。

  • op1 << op2—— SHIFT LEFT运算符将位移动到左边,放弃最左边的位,并将最右边的位赋值为0。每向左移动一步,op1就会乘以2。

  • op1 >> op2—— SHIFT RIGHT运算符将位向右移动,放弃最右边的位,并将最左边的位赋值为0。每向右移动一步,op1就会被分成两半。保留最左边的符号位。

  • op1 >>> op2—— SHIFT RIGHT-ZERO FILL运算符将位向右移动,放弃最右边的位,并将最左边的位赋值为0。每向右移动一步,op1就会被分成两半。最左边的符号位被丢弃。

按位运算符是一次处理一个位的运算符。

只有当它的两个输入都是1时,AND 才是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) AND 它,所以:

    203: 1100 1011
AND  15: 0000 1111
------------------
IS  11: 0000 1011

值得注意的是,作为其他答案列出的单位真值表一次只对一个或两个输入位起作用。使用整数时会发生什么,例如:

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

我之所以提到这一点,是因为我仍然记得很多年前我知道这一点时的那个“啊哈!”时刻。

为了进一步细分,它与所讨论的值的二进制表示有很大关系。

For example (in decimal):
x = 8
y = 1


would come out to (in binary):
x = 1000
y = 0001


From there, you can do computational operations such as 'and' or 'or'; in this case:
x | y =
1000
0001 |
------
1001


or...9 in decimal

希望这个能帮上忙。

当提到术语“按位”时,它有时是在澄清那不是一个“逻辑”操作符。

例如,在 JavaScript 中,按位运算符将其操作数视为32位(0和1)的序列; 与此同时,逻辑运算符通常与布尔(逻辑)值一起使用可以处理非布尔类型。

以 expr1 & & expr2为例。

如果可以转换,则返回 expr1 To false; 否则返回 expr2。 因此,当与布尔值一起使用时, 如果两个操作数都是 True; 否则返回 false。

a = "Cat" && "Dog"     // t && t returns Dog
a = 2 && 4     // t && t returns 4

正如其他人所指出的,2 & 4是一个位 AND,因此它将返回0。

您可以将以下内容复制到 test.html 或其他内容并进行测试:

<html>
<body>
<script>
alert("\"Cat\" && \"Dog\" = " + ("Cat" && "Dog") + "\n"
+ "2 && 4 = " + (2 && 4) + "\n"
+ "2 & 4 = " + (2 & 4));
</script>

由于没有人提出这些方法为何有用的问题:

在处理标志时,我经常使用位操作。例如,如果希望将一系列标志传递给某个操作(例如,File.Open(),同时启用读模式和写模式) ,则可以将它们作为单个值传递。这是通过在位集(byte、 short、 int 或 long)中为每个可能的标志分配它自己的位来实现的。例如:

 Read: 00000001
Write: 00000010

因此,如果要传递 READ AND WRITE,应该传递(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)异或当前值,它将关闭和打开左和右。

位移在几种情况下是有用的。

x << y

X * 2

如果你需要快速乘以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是一样的,所以本质上,对于红色,你可以这样做:

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)

我一直听说 JavaScript 的逐位运算符有多慢。我对 我最新的博客文章做了一些测试,发现它们在几个测试中比算术替代方案快40% 到80% 。也许他们以前动作很慢。在现代浏览器中,我喜欢它们。

因为这个原因,我的代码中有一个案例将会更快更容易阅读。我会继续留意的。

这样想可能会有帮助,下面是 AND (&)的工作原理:

它基本上说的是这两个数字1,所以如果你有两个数字5和3,它们将被转换成二进制,计算机会思考

         5: 00000101
3: 00000011

都是一: 00000001 0为假,1为真

所以5和3的 AND 是1。OR (|)运算符执行相同的操作,只是其中一个数字必须为1才能输出1,而不是两个数字都为1。

在数码电脑程式设计中,位操作会以一个或多个位元模式或二进位数字的位元水平运作。它是处理器直接支持的快速原始操作,用于操作比较和计算的值。

行动 :

  • 按位与

  • 按位 OR

  • 按位不

  • 按位异或(XOR)

  • 等等

列表项目

    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

艾格。

    203: 1100 1011
AND  15: 0000 1111
------------------
=  11: 0000 1011

位运算符的用法

  • 左移算子和右移算子分别等价于乘法和除以 x * 2

艾格。

int main()
{
int x = 19;
printf ("x << 1 = %d\n" , x <<1);
printf ("x >> 1 = %d\n", x >>1);
return 0;
}
// Output: 38 9
  • 操作符 & 可以用来快速检查一个数字是奇数还是偶数

艾格。

int main()
{
int x = 19;
(x & 1)? printf("Odd"): printf("Even");
return 0;
}
// Output: Odd
  • 在不使用 if else语句的情况下快速查找 x 和 y 的最小值

艾格。

int min(int x, int y)
{
return y ^ ((x ^ y) & - (x < y))
}
  • 十进制到二进制 转变

艾格。

#include <stdio.h>
int main ()
{
int n , c , k ;
printf("Enter an integer in decimal number system\n " ) ;
scanf( "%d" , & n );
printf("%d in binary number
system is: \n " , n ) ;
for ( c = 31; c >= 0 ; c -- )
{
k = n >> c ;
if ( k & 1 )
printf("1" ) ;
else
printf("0" ) ;
}
printf(" \n " );
return 0 ;
}
  • 异或门加密由于其复杂性和程序员的重复使用而成为一种流行的加密技术。
  • 从技术面试的角度来看,按位异或操作符是最有用的操作符。

位移只对 + ve 数起作用

此外,按位逻辑的使用范围也很广泛