说说异或运算^和他的一个常用作用 (转载)

说说异或运算^和他的一个常用作用。
异或的运算方法是一个二进制运算:
1^1=0
0^0=0
1^0=1
0^1=1

两者相等为0,不等为1.

这样我们发现交换两个整数的值时可以不用第三个参数。
如a=11,b=9.以下是二进制
a=a^b=1011^1001=0010;
b=b^a=1001^0010=1011;
a=a^b=0010^1011=1001;
这样一来a=9,b=11了。


举一个运用, 按一个按钮交换两个mc的位置可以这样。

mybt.onPress=function()
{
mc1._x=mc1._x^mc2._x;
mc2._x=mc2._x^mc1._x;
mc1._x=mc1._x^mc2._x;
//
mc1._y=mc1._y^mc2._y;
mc2._y=mc2._y^mc1._y;
mc1._y=mc1._y^mc2._y;
}

这样就可以不通过监时变量来传递了。

最后要声明:只能用于整数。

### C++ 中异或运算符 `^` 的用法功能 #### 1. 异或运算符的基础定义 在 C++ 中,异或运算(`^`) 是一种按位逻辑运算符。它对两个整数的操作数逐位执行 XOR 运算。如果对应的两位相同,则结果为 0;如果不同,则结果为 1。 例如: ```cpp // 示例代码展示基本的异或操作 #include <iostream> using namespace std; int main() { unsigned char a = 6; // 二进制表示为 0110 unsigned char b = 3; // 二进制表示为 0011 cout << (a ^ b); // 输出 5,因为 0110 ^ 0011 = 0101 } ``` #### 2. 异或运算的主要特性 - **交换律**:`A ^ B == B ^ A`[^1]。 - **结合律**:`(A ^ B) ^ C == A ^ (B ^ C)`[^1]。 - **自反性**:任何数与其本身异或的结果为 0,即 `A ^ A == 0`。 - **恒等性**:任何数与 0 异或的结果仍为该数,即 `A ^ 0 == A`[^1]。 这些性质使得异或运算成为解决某些算法问题的强大工具。 #### 3. 实际应用案例 ##### 3.1 找到数组中只出现一次的数字 在一个数组中,除了两个数字外,其他所有数字都出现了两次。利用异或的特性可以找到这两个唯一的数字。 实现如下: ```cpp class Solution { public: vector<int> singleNumber(vector<int>& nums) { int xor_two = 0; for(auto num : nums){ xor_two ^= num; // 计算所有元素的异或值 } // 获取异或结果中最右边的一个 1 int last_bit = xor_two & (-xor_two); vector<int> result(2, 0); for(auto num : nums){ if(num & last_bit){ // 将数组分为两组 result[0] ^= num; }else{ result[1] ^= num; } } return result; } }; ``` 此代码通过分组的方式将两个唯一数字区分开来,并最终返回它们[^1]。 ##### 3.2 判断两个变量是否相等而不使用比较运算符 可以通过异或判断两个变量是否完全一致。如果两者相等,则其异或结果必然是 0。 示例代码: ```cpp bool areEqual(int a, int b) { return !(a ^ b); // 如果 a b 完全相等,则返回 true } ``` ##### 3.3 不借助临时变量交换两个数值 异或也可以用于不引入额外空间的情况下完成两个变量的互换: ```cpp void swapWithoutTemp(int& a, int& b) { a = a ^ b; // 第一步 b = a ^ b; // 第二步恢复原来的 a 给 b a = a ^ b; // 第三步恢复原来的 b 给 a } // 测试函数 int main(){ int x = 7, y = 9; swapWithoutTemp(x, y); cout << "x=" << x << ",y=" << y; // 输出 x=9,y=7 } ``` #### 4. 负数参与异或的情况 当涉及负数时,C++ 使用补码形式存储数据。因此,在处理带符号整数时需要注意补码的影响。例如 `-3` 的补码计算过程已经在引用中给出[^2]。 总结来说,对于任意整型数据(无论是正还是负),都可以安全地运用异或运算,只需理解底层机制即可正确解读结果。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值