一次对多个整数应用按位运算符
Apply Bitwise operator on multiple integers at once
我有一个整数列表,可以包含任意数量的项目。现在,我想计算所有这些数字的按位异或。如果数字已知,可以按如下方式完成:
int xor = 10 ^ 25 ^ 40 ^ 55......and so on
但是当元素数量未知时,我无法在运行时为列表中的每个元素动态实现它。
我想一次对所有时间应用按位异或,而不是一次两个。
您可以遍历元素并将异或应用于结果变量,如下所示:
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
这里发生的实际计算是完全一样的。
您可以将此概念扩展为循环并获得所需的效果。
您可以使用 Aggregate
扩展方法(来自 System.Linq
)对数组中的每个项目应用累加器函数。它的工作原理是取一个起始值(在这种情况下我们可以使用 0
,因为 0 ^ n == n
),并对列表中的每个项目应用累加器函数。
在我们的例子中,累加器只是将数字与下一个值的异或再次加回数字:
int[] numbers = {10, 25, 40, 55};
int result = numbers.Aggregate(0, (accumulation, next) => accumulation ^ next);
// result = 12
我有一个整数列表,可以包含任意数量的项目。现在,我想计算所有这些数字的按位异或。如果数字已知,可以按如下方式完成:
int xor = 10 ^ 25 ^ 40 ^ 55......and so on
但是当元素数量未知时,我无法在运行时为列表中的每个元素动态实现它。 我想一次对所有时间应用按位异或,而不是一次两个。
您可以遍历元素并将异或应用于结果变量,如下所示:
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
这里发生的实际计算是完全一样的。
您可以将此概念扩展为循环并获得所需的效果。
您可以使用 Aggregate
扩展方法(来自 System.Linq
)对数组中的每个项目应用累加器函数。它的工作原理是取一个起始值(在这种情况下我们可以使用 0
,因为 0 ^ n == n
),并对列表中的每个项目应用累加器函数。
在我们的例子中,累加器只是将数字与下一个值的异或再次加回数字:
int[] numbers = {10, 25, 40, 55};
int result = numbers.Aggregate(0, (accumulation, next) => accumulation ^ next);
// result = 12