我找到了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
符号,但我不明白它在这个程序中是如何运作的......
答案 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)
在C ++中^
是xor
运算符:http://en.cppreference.com/w/cpp/keyword/xor / https://en.m.wikipedia.org/wiki/Exclusive_or
答案 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;
}