Применить побитовый оператор сразу к нескольким целым числам - PullRequest
0 голосов
/ 01 августа 2020

У меня есть список целых чисел, в котором может быть любое количество элементов. Теперь я хочу вычислить БИТВОЙНОЕ ИЛИ всех этих чисел. Если числа уже известны, это можно сделать следующим образом:

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

Но когда количество элементов неизвестно, я не могу добиться этого динамически во время выполнения для каждого элемента списка. Я хочу применить побитовое исключающее ИЛИ ко всем моментам одновременно, а не к двум за раз.

Ответы [ 2 ]

5 голосов
/ 01 августа 2020

Вы можете использовать метод расширения Aggregate (от System.Linq), чтобы применить функцию накопителя к каждому элементу в массиве. Он работает, беря начальное значение (в данном случае мы можем использовать 0, поскольку 0 ^ n == n) и применяя функцию аккумулятора для каждого элемента в списке.

В нашем случае аккумулятор просто добавляет XOR числа со следующим значением снова возвращается к числу:

int[] numbers = {10, 25, 40, 55};
int result = numbers.Aggregate(0, (accumulation, next) => accumulation ^ next);
// result = 12
2 голосов
/ 01 августа 2020

Вы можете l oop над элементами и применить xor к переменной результата, например:

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

Из-за взаимозаменяемости xor эти два подхода имеют одинаковый результат:

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

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

См. Здесь: https://dotnetfiddle.net/zqSVad Фактический расчет здесь точно такой же. Вы можете расширить эту концепцию до al oop и получить желаемый эффект.

...