位运算符之异或

文章介绍了C++中的按位运算符中的异或运算符^,它遵循“相同为0,相异为1”的规则。异或运算有特定的性质,如a^0=a,a^a=0,以及满足交换律和结合律。文章通过一个例题解释了如何利用异或运算找出数组中只出现一次的数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

按位运算符 – 异或(^)

1. 按位运算符

按位运算符对整数值的位进行操作。例如,左移运算符将位向左移,按位非运算符将所有的1变成0,所有的0变为1,C++共有6个这样的运算符:<<>>~&|^。今天我们来介绍其中一种,异或运算符(^).

2. 按位异或运算符

异或(^)运算符在两个运算对象上逐位执行相应的逻辑操作:

size_t b1 = 10;// 00001010
size_t b2 = 15;// 00001111
	   b1 ^ b2;// 00000101

对于位异或运算符(^)来说,如果两个运算对象的对应位置有且只有一个为1,则运算结果中该位为1,否则为0。可以理解为“相同为0相异为1”。

3. 性质

异或运算有以下三个性质:

  1. 任何数和 0 做异或运算,结果仍然是原来的数,即 a ^ 0 = a
  2. 任何数和其自身做异或运算,结果是 0 ,即 a ^ a = 0
  3. 异或运算满足交换律和结合律,即 a ^ b ^ a = b ^ a ^ a = b ^ (a ^ a) = b ^ 0 = b

4. 例题

只出现一次的数字

解题思路

假设数组中有 2m+1个数,其中有 m 个数各出现两次,一个数出现一次。令 a1、a2、 a3、……、 am、为出现两次的 m 个数,am+1为出现一次的数。

根据性质 3,数组中的全部元素的异或运算结果总是可以写成如下形式:

(a1 ^ a1) ^ (a2 ^ a2) ^ …… ^ (am ^ am) ^ am+1

根据性质 2 和性质 1,上式可化简和计算得到如下结果:

0 ^ 0 ^ …… ^ 0 ^ am+1= am+1

因此,数组中的全部元素的异或运算结果即为数组中只出现一次的数字。

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;
        for (auto e: nums) 
        {
            ret ^= e;
        }
        return ret;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值