C++之异或运算符

10 篇文章 2 订阅

前言:做leetcode遇到Missing Number和Single Number ⅠⅢ问题

一、"异或"运算符(“∧”)

也称XOR运算符。规则:相同为0,相异为1,0∧0=0,0∧1=1,1∧0=1,1∧1=0

应用:

(1)与0相∧,保留原值

(2)交换两个值,不用临时变量 

a = a^b;
b = b^a;
a = a^b;
3)与自己相 ∧,值为0

二、leetcode No268. Missing Number

Question:

Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array.

For example,
Given nums = [0, 1, 3] return 2.

Algorithm:Bit Manipulation

把0-n的数异或后再与nums里的数异或,即得到Missing Number(除了Missing Number都自己与自己异或了一次)

Submitted Code:
class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int xor_num = 0;
        int length = nums.size();
        while(length!=0)
        {
            xor_num ^= length;
            length--;
        }
        for(int i : nums)xor_num ^= i;
        return xor_num;
    }
};

三、leetcode No136. Single Number

Question:
Given an array of integers, every element appears twice except for one. Find that single one.
Algorithm:Bit Manipulation
所有元素异或
Submitted Code:
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int x = 0;
        for(int i=0;i<nums.size();i++)
            x = x^nums[i];
        return x;
    }
};

四、leetcode No260. Single Number III

Question:

Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.

For example:

Given nums = [1, 2, 1, 3, 2, 5], return [3, 5].

Algorithm:Bit Manipulation

1、按照Single Number的方法,对所有元素异或,那么得到的是这两个元素异或值xor_two
2、如何将两个元素分开,由于值不同的位异或为1,所以我们不妨可以找出xor_two的最后一个1(-xor_two为其补码),把两个元素区别,然后再分别对两个数组异或
Submitted Code:
class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int xor_two = nums[0];
        int last_bit = 0;
        vector<int> result = {0,0};
        for(int i=1;i<nums.size();i++)
            xor_two = xor_two ^ nums[i];
        last_bit = xor_two & (~(xor_two-1)); //相异为1,取异或的最后一个1,把两个元素区分,然后分别对两个数组异或
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i] & last_bit)
                result[0] ^= nums[i];
            else
                result[1] ^= nums[i];
        }
        return result;
    }
};




异或运算符是一种二进制运算符,常用符号为“^”,其底层代码实现可以通过位运算实现。在实现异或运算时,需要将两个二进制数字进行位与运算,并将结果保存到一个新的二进制数字中。如果两个二进制数字相同,则新数字中对应位置的值为0,否则为1。例如,对于数字10和6(以二进制形式表示为1010和0110),它们的异或结果为1100,也就是12(以十进制形式表示)。 在计算机底层,异或运算符的实现可使用逻辑电路和门电路来实现。我们可以使用逻辑门、晶体管等器件,将两个输入数字进行逻辑异或运算,并将结果输出。在计算机中,这个过程会不断进行,直到所有的运算都完成,得到最终的结果。 总之,异或运算符底层代码的实现需要对输入的两个二进制数字进行位运算,然后进行逻辑电路和门电路处理,得到最终的结果,这样就完成了异或运算的底层实现。 ### 回答2: 异或运算符是一种常用的二进制运算符,在计算机领域中应用广泛。在底层实现中,异或运算符的实现方式会因不同的硬件平台或软件实现而有所不同。下面将介绍一些可能的实现方式。 1. 基于位运算的实现方式 在大多数机器上,异或运算符可以通过使用逐位异或实现。在逐位异或的实现过程中,如果两个操作数的某个位相同,则异或运算的结果为0,否则结果为1。这种实现方式可以通过位运算指令(如 AND、OR、XOR)来实现,例如: xor eax, ebx ; eax = eax ^ ebx 其中,eax 和 ebx 是需要执行异或操作的操作数。 2. 基于逻辑门电路的实现方式 在电路设计中,异或运算可通过逻辑门电路实现。逻辑门电路包括与门、或门、非门、与非门、异或门、同或门,其中异或门可以用于实现异或运算符异或门的输出只有在输入 A 和输入 B 的状态不同时才为1,否则为0。因此,在实现异或运算时,可以使用逻辑门电路来构造异或门,并输出其输出。 3. 基于定制硬件的实现方式 有些应用需要高速异或运算的支持,求助于硬件电路。在设计定制硬件电路中,可以使用特殊的异或门,比如,Xilinx 公司生产的 Virtex 系列的芯片中,提供了具有高性能的异或门电路。 综上所述,异或运算符的底层代码实现方式是多种多样的,可以根据具体应用需求来选择不同的实现方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值