JavaScript中的(|)按位OR与(^)Bitwise XOR之间的差异

时间:2017-08-24 01:32:53

标签: javascript bitwise-operators

我对 JavaScript | OR与^ XOR的使用感到困惑,如下面的简单示例所示;

(function sayHi(n){
if(n < 1)   //base case
    return;
console.log("Hi!!" | "Hello!!") ;
sayHi(n - 1);   //recurse
})(5);


(function sayHi(n){
if(n < 1)   //base case
    return;
console.log("Hi!!" ^ "Hello!!") ;
sayHi(n - 1);   //recurse
})(5);
(function sayHi(n){
if(n < 1)   //base case
    return;
console.log(2 | 6) ;
sayHi(n - 1);   //recurse
})(5);


(function sayHi(n){
if(n < 1)   //base case
    return;
console.log(2 ^ 6) ;
sayHi(n - 1);   //recurse
})(5);

我对何时,如何,为何,我应该适当使用| vs ^感到困惑。

有人可以帮我理解ORXOR操作之间的主要区别吗?

我正在阅读来自MDN web Docs的JavaScript文档,以便更好地理解按位操作的概念,但我很难理解它们的显着差异。

我只想确保今后继续正确使用这些操作。

非常感谢您的期待!

5 个答案:

答案 0 :(得分:2)

| 是按位或

因此,如果在两个操作数中设置了任一位,则将在结果中设置

^ 是一个异或,所以如果在其中一个操作数中设置了一个位,它将在结果中设置,否则,它将不会被设置。

var x,y;

for (x = 0; x <= 1; x++) {
    for (y = 0; y <= 1; y++) {
	console.log('XOR '+ x + "^" + y + "=" + (x^y));
	console.log('OR '+ x + "|" + y + "=" + (x|y));
    }
}

答案 1 :(得分:1)

OR和XOR是不同的运算符:

  • OR:

    0 | 0 = 0
    0 | 1 = 1
    1 | 0 = 1
    1 | 1 = 1
    
  • XOR

    0 ^ 0 = 0
    0 ^ 1 = 1
    1 ^ 0 = 1
    1 ^ 1 = 0
    

如果你有两个位并将它们与OR组合,结果将为1,如果这些位中的一个或两者都是1.如果将它们与XOR(异或)组合,那么如果只有其中一个,它将为1位是1(如果两者都是如此)。

答案 2 :(得分:1)

按位运算符通常用于检查二进制中的位是否为set。您可以将其视为一组布尔值,将其压缩为字符串11100101,其中每个bit用于表示boolean标记true或{{1} },1表示false,0表示set

二进制阅读与我们通常的英语不同。它是从右到左完成的,最左边的位是最重要的位,因为它保持最大值而左侧位是最小的。

示例:

值:64 =二进制unset

值:1 =二进制10000000

现在回到你的问题。

问:我很困惑何时,如何,为什么,我应该在哪里使用| vs ^。

位图掩码及其运算符在低级编程中更常见,其中00000001是约束(小型计算设备)或memory关键应用程序。

使用权利有利吗?但它们也有它们的缺点,它是代码performance。内存很便宜,处理能力比以前大得多,因此人们在进行高级应用程序编程时往往会放弃这一优势。

问:有人可以帮我理解OR和XOR操作之间的主要区别吗?

readabilityOR操作用于比较两个二进制文件。假设二进制A和二进制B。

外行。可以读取XOR操作OR,就好像设置了| B中的位然后返回OR,即set

示例:

1

10000000 // Value 64 in binary 00000001 // Value 1 in binary 10000001 // Gives you 65 when you perform | OR operation = 65 操作有点像XOR,但它有另一种特殊功能,即当两个位为OR时,它会返回same

示例:

0

从内存中,您通常只使用10000001 // Value 65 in binary 10000000 // Value 64 in binary 00000001 // Gives you 1 when you perform ^ XOR operation = 1 运算符来检查是否设置了位。所以你可能对它以及AND &操作更感兴趣。

答案 3 :(得分:0)

您的代码没有意义,按位运算符(OR,XOR,AND)只能用于数字,而不能用于字符串。

每个数字在内存中以位表示,每个位为1或0(真或假,开或关等)。 1和0是数字,就像我们的计数系统中的1,2,3,4是数字。计算机使用的计数系统称为二进制。

按位运算基本上对两个操作数中的每个位执行同名操作(OR,XOR或AND)。

以5 ^ 3(5 XOR 3)为例:

5以二进制表示为00000101

3以二进制表示为00000011

对于每个操作,您有一个左输入和一个右输入。 XOR代表eXclusive OR,如果左或右输入为1则返回1,但如果它们都是1则不返回。 如果任一输入为1,则OR返回1,因此如果两者都为1,则输出也将为1.

对数字进行逐位运算会对每个数字中的每个对应位执行此操作,因此5 ^ 3 = 00000110,即6。

注意:二进制数从右到左书写。每个数字对应2的幂,就像数字在计数时如何对应10的幂。最左边的数字代表2的最高功率(在这种情况下,2到7,即128)。

  • 0 ^ 0 = 0表示前5位
  • 1 ^ 0 = 1表示第6位
  • 0 ^ 1 =第7位为
  • 1 ^ 1 = 0表示第8位

同时,5 | 3 = 00000111,即7。

  • 0 | 0 = 0表示前5位
  • 1 |第6位为0 = 1
  • 0 | 1 = 1表示第7位
  • 1 |第8位为1 = 1

答案 4 :(得分:0)

它们是不同的数学(逻辑)运算符,与数学相关而不是JavaScript。

OR / |,或称为“包含OR”,类似于英文短语“A和/或B”,有3种可能性:不是A而是B,不是B而是A ,A和B。

XOR / ^,或称为“异或”,类似于英文短语“A或B”,只有两种可能性:不是A而是B,不是B而是A你可以看到“A和B都被排除在外”,因此被称为“独占”。

参考:

https://en.wikipedia.org/wiki/Logical_connective