XOR运算符如何在此程序中运行?

时间:2016-10-18 11:22:39

标签: c++ algorithm bitwise-operators

我找到了Sock Merchant HackerRank问题(https://www.hackerrank.com/challenges/sock-merchant)的一个解决方案,其中包括:

using namespace std;


int main(){


   int n;
cin>>n;
int i;
int arr[n];
for(i=0;i<n;i++)
    cin>>arr[i];
sort(arr,arr+n);
int c=0;
for(i=0;i<n;i++)
{

    if((arr[i]^arr[i+1])==0)
    {
        c++;
        i++;
    }

}
cout<<c<<endl;
return 0;

}

我真的不明白if语句中发生了什么。我在某处读到^是一个XOR符号,但我不明白它在这个程序中是如何运作的......

5 个答案:

答案 0 :(得分:3)

按位异或(https://en.wikipedia.org/wiki/Bitwise_operation#XOR

  

ARR [I] ^ ARR [I + 1]

检查arr[i]arr[i+1]是否不同(如果不同则返回1,否则返回0)。更准确地说,(arr[i]^arr[i+1])是一个布尔表达式,因此如果两个数字不同则返回true,否则返回false

答案 1 :(得分:1)

答案 2 :(得分:1)

如果数字相同,则按位XOR的工作方式如下,例如:

1011 0110
1011 0110
---- ----
0000 0000

如果数字不同(即使只有1位),那么例如:

1011 1110
1011 0110
---- ----
0000 1000

基本上是这样的:

if((arr[i]^arr[i+1])==0)
//is the same as
if (arr[i] == arr[i+1])

Hooray用于可读代码。

答案 3 :(得分:0)

按位XOR操作用于检查变量1和变量2是否不同。在您的示例中,arr[i]arr[i+1]是相同还是不同。

same ^ same = false
same ^ different = true
different ^ same = true
different ^ different = false

我能想出最简单的解释。希望它有所帮助。

答案 4 :(得分:0)

Bitwise Xor概念是

相同值的xor将为0和

不同值的xor将为1

您尚未检查数组索引 这里

if((arr[i]^arr[i+1])==0)
    {
        c++;
        i++;
    }

arr [i + 1]超出了索引的最大限制。

最终代码

int main(){
int n;
cin>>n;
int i;
int arr[n];
for(i=0;i<n;i++)
    cin>>arr[i];
sort(arr,arr+n);
int c=0;
for(i=1;i<n;i++)
{

    if((arr[i]^arr[i-1])==0)
    {
        c++;
        i++;
    }

}
cout<<c<<endl;
return 0;

}