Mam listę liczb całkowitych, które mogą mieć dowolną liczbę przedmiotów. Teraz chcę obliczyć bitowy XOR wszystkich tych liczb. Jeśli liczby są już znane, można to zrobić w następujący sposób:

int xor = 10 ^ 25 ^ 40 ^ 55......and so on

Ale gdy liczba elementów nie jest nieznana, nie jestem w stanie osiągnąć go dynamicznie w czasie wykonywania, dla każdego elementu listy. Chcę zastosować BitWise Xor do wszystkich czasów od razu, nie dwa na raz.

1
Brijesh Ahuja 1 sierpień 2020, 02:33

2 odpowiedzi

Najlepsza odpowiedź

Możesz pętli nad elementami i zastosować XOR do zmiennej wyników, tak jak:

int[] values = new int[] { 10, 25, 40, 55 };
int xor = values[0];
for(int i = 1; i < values.Length; i++) {
    xor ^= values[i];
}

Ze względu na wymienną naturę XOR, te dwa podejścia mają ten sam wynik:

// In one line
int xor1 = 10 ^ 25 ^ 40;

// In separate lines
int xor2 = 10 ^ 25;
xor2 ^= 40;

Zobacz tutaj: https://dotnetfiddle.net/zqsvad
Rzeczywiste obliczenia dzieje się tutaj dokładnie to samo. Możesz rozszerzyć tę koncepcję do pętli i mieć pożądany efekt.

2
founderio 1 sierpień 2020, 00:00

Możesz użyć {{ X0}} metoda rozszerzenia (z System.Linq) Aby zastosować funkcję akumulatora nad każdym elementem w tablicy. Działa poprzez podjęcie wartości wyjściowej (możemy użyć 0 w tym przypadku, ponieważ 0 ^ n == n) i stosowanie funkcji akumulatora dla każdego elementu na liście.

W naszym przypadku akumulator po prostu dodał XOR numeru z następną wartością z powrotem do numeru ponownie:

int[] numbers = {10, 25, 40, 55};
int result = numbers.Aggregate(0, (accumulation, next) => accumulation ^ next);
// result = 12
5
Rufus L 31 lipiec 2020, 23:57