2016-10-18 5 views
-5

Я нашел одно решение этой проблемы Носок Merchant HackerRank (https://www.hackerrank.com/challenges/sock-merchant), которая заключается в следующем:Как работает оператор XOR в этой программе?

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; 

} 

Я не очень понимаю, что Происходило в если заявление. Я где-то читал, что^является XOR символом, но я не понимаю, как он работает в этой программе ....

+5

насчет чтения книги о C или C++? – gnasher729

+0

[Список операторов C++] (https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B) – Borgleader

+0

@samgak Вы правы, я редактировал заголовок вопроса. Спасибо! –

ответ

3

побитовое исключающее ИЛИ (https://en.wikipedia.org/wiki/Bitwise_operation#XOR)

обр [я]^обр [+ 1]

проверка, если arr[i] и arr[i+1] являются д ifferent (возврат 1, если они разные, 0 в противном случае). Точнее, (arr[i]^arr[i+1]) является булевым выражением, поэтому он возвращает true, если оба числа разные, и false в противном случае.

+3

'return 1 if they different. Больше похоже на не-0, но не обязательно 1. Это не логический оператор – deviantfan

+0

@deviantfan, это правильно – artm

0

Побитовое устройство XOR используется для проверки того, отличается ли переменная 1 и переменная 2. В случае вашего примера, arr[i] и arr[i+1] такие же или разные.

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

Простейшее объяснение, которое я могу придумать. Надеюсь, поможет.

1

Если номера совпадают, побитовое исключающее работает следующим образом, например:

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 для читаемого кода.

0

побитовое исключающее ИЛИ понятие

исключающее одинаковых значений будет 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; 

}