异或运算符在这个程序中是如何起作用的

How does the XOR operator function in this program?

本文关键字:起作用 程序 运算符      更新时间:2023-10-16

我找到了一个解决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符号,但我不明白它在这个程序中的作用....

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

arr[我]^ arr (i + 1)

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

c++中^xor运算符:http://en.cppreference.com/w/cpp/keyword/xor/https://en.m.wikipedia.org/wiki/Exclusive_or

如果数字相同,按位异或操作如下,例如

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])

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

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

这是我能想到的最简单的解释。

按位异位的概念是

相同值的

xor将为0和

不同值的值为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;
}