【位运算 拆位法】1835. 所有数对按位与结果的异或和

简介: 【位运算 拆位法】1835. 所有数对按位与结果的异或和

本文涉及知识点

位运算 拆位法

LeetCode1835. 所有数对按位与结果的异或

列表的 异或和(XOR sum)指对所有元素进行按位 XOR 运算的结果。如果列表中仅有一个元素,那么其 异或和 就等于该元素。

例如,[1,2,3,4] 的 异或和 等于 1 XOR 2 XOR 3 XOR 4 = 4 ,而 [3] 的 异或和 等于 3 。

给你两个下标 从 0 开始 计数的数组 arr1 和 arr2 ,两数组均由非负整数组成。

根据每个 (i, j) 数对,构造一个由 arr1[i] AND arr2[j](按位 AND 运算)结果组成的列表。其中 0 <= i < arr1.length 且 0 <= j < arr2.length 。

返回上述列表的 异或和 。

示例 1:

输入:arr1 = [1,2,3], arr2 = [6,5]

输出:0

解释:列表 = [1 AND 6, 1 AND 5, 2 AND 6, 2 AND 5, 3 AND 6, 3 AND 5] = [0,1,2,0,2,1] ,

异或和 = 0 XOR 1 XOR 2 XOR 0 XOR 2 XOR 1 = 0 。

示例 2:

输入:arr1 = [12], arr2 = [4]

输出:4

解释:列表 = [12 AND 4] = [4] ,异或和 = 4 。

提示:

1 <= arr1.length, arr2.length <= 105

0 <= arr1[i], arr2[j] <= 109

拆位法

image.png

代码

核心代码

class Solution {
public:
  int getXORSum(vector<int>& arr1, vector<int>& arr2) {
    const int iBitCnt = 31;
    int iRet = 0;
    for (int i = 0; i < iBitCnt; i++) {
      int cnt1 = 0, cnt2 = 0;
      for (const auto& n : arr1) {
        cnt1 += bool(n & (1 << i));
      }
      for (const auto& n : arr2) {
        cnt2 += bool(n & (1 << i));
      }
      if ((1 & cnt1) && (1 & cnt2)) {
        iRet |= (1 << i);
      }
    }
    return iRet;
  }
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{
    assert(t1 == t2);
}
template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{
    if (v1.size() != v2.size())
    {
        assert(false);
        return;
    }
    for (int i = 0; i < v1.size(); i++)
    {
        Assert(v1[i], v2[i]);
    }
}
int main()
{
  vector<int> arr1, arr2;
  {
    Solution sln;
    arr1 = { 1, 2, 3 }, arr2 = { 6, 5 };
    auto res = sln.getXORSum(arr1, arr2);
    Assert(0, res);
  }
  {
    Solution sln;
    arr1 = { 12 }, arr2 = { 4};
    auto res = sln.getXORSum(arr1, arr2);
    Assert(4, res);
  }
}


我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17

或者 操作系统:win10 开发环境: VS2022 C++17

如无特殊说明,本算法用**C++**实现。

相关文章
|
8月前
|
测试技术 Windows
【动态规划】【位运算】1787. 使所有区间的异或结果为零
【动态规划】【位运算】1787. 使所有区间的异或结果为零
|
8月前
玩转位运算
玩转位运算
|
3月前
|
机器学习/深度学习
位运算详解
本文介绍了位运算符及其基本操作,并通过几个例题详细解析了位运算的应用。内容包括左移`&lt;&lt;`、右移`&gt;&gt;`、按位取反`~`、与运算`&`、或运算`|`和异或运算`^`等运算符的使用方法。基本操作部分展示了如何检查和修改二进制位,以及异或运算的性质。例题部分则通过判定字符是否唯一、丢失的数字、两整数之和和消失的两个数字等问题,具体说明了位运算的实际应用技巧。
78 7
位运算详解
|
8月前
[leetcode 数位运算] 2939. 最大异或乘积 M
[leetcode 数位运算] 2939. 最大异或乘积 M
位运算中的按位与(&),按位或(|),按位异或(^)
位运算中的按位与(&),按位或(|),按位异或(^)
149 0
位运算中的按位与(&),按位或(|),按位异或(^)
取余运算的使用
取余运算的使用
237 0
位运算的小技巧
快速学习位运算的小技巧
位运算:题集
1.a^b(快速幂) 题目: 求 a 的 b 次方对 p 取模的值。
111 0
使用^、&(异或、并且)位运算 实现算数加法(+)
用位运算即是计算机的运算规则,而计算机只懂得二进制,所以位运算使用的进制是二进制。
182 0
使用^、&(异或、并且)位运算 实现算数加法(+)

热门文章

最新文章