使用Linq对整数按奇偶分组时x&1的逻辑原理是什么
代码运行原理说明
1. x & 1位运算的逻辑
这是二进制按位与运算,用于快速判断整数的奇偶性:
- 所有整数的二进制表示中,奇数最后一位为1,偶数最后一位为0
- 任意整数和1做按位与运算时,仅会保留二进制最后一位的数值,其余位都会被置为0:
- 奇数运算结果固定为1,例如
3 & 1 = 1 - 偶数运算结果固定为0,例如
4 & 1 = 0
- 奇数运算结果固定为1,例如
- 该运算和取模运算
x % 2的奇偶判断效果一致,且执行效率更高;同时不会因为输入负整数出现负余数,得到的分组key只会是0或1,分组结果更统一。这里就是用运算结果作为分组的key,0对应偶数分组,1对应奇数分组。
2. ToLookup方法的作用
你平时常用的常规分组方法一般是GroupBy,二者核心差异如下:
GroupBy属于延迟执行方法,每次遍历分组结果时都会重新执行分组逻辑,返回值为IEnumerable<IGrouping<TKey, TElement>>类型ToLookup属于立即执行方法,调用后会立刻完成全部分组计算并将结果缓存到内存中,返回值为ILookup<TKey, TElement>类型,该接口本身实现了IEnumerable<IGrouping<TKey, TElement>>,所以后续调用ToList()就可以匹配方法要求的IList<IGrouping<int, int>>返回值类型。
3. 等效的常规分组写法
用你熟悉的GroupBy也可以实现完全一致的效果,参考代码如下:
public IList<IGrouping<int, int>> GroupEvenAndOddNumbers(int[] numbers) { // 按奇偶分组后转List即可得到和原代码完全一致的返回结果 return numbers.GroupBy(x => x & 1).ToList(); // 也可以替换为你更熟悉的取模写法,正整数场景下结果完全一致: // return numbers.GroupBy(x => x % 2).ToList(); }
内容的提问来源于stack exchange,提问作者retlok
相关产品推荐
相关产品推荐

