C语言利用异或进行两个值的交换

本文介绍了一种不使用额外变量实现两个整数交换的方法,通过异或运算的两个重要性质:A^A=0 和 A^0=A。文中提供了一个简单的 C 语言示例程序来展示这一技巧。

异或有两个很重要的性质:

1、 A^A = 0;

2、A^0 = A;

利用这两个性质,我们就能够利用异或进行两个值的交换。

代码如下:

#include <stdio.h>

int main()
{
    int a = -11;
    int b = -1;
    
    a = a^b;
    b = a^b;
    a = a^b;

    /*或者简写为
     * 
    a ^= b;
    b ^= a;
    a ^= b
    *
    **/
    printf("交换后a = %d,b = %d\n",a,b);
    return 0;
}

 

转载于:https://www.cnblogs.com/qingergege/p/7427594.html

<think>好的,我现在需要回答用户关于C语言异或运算的用法和示例的问题。首先,我得回顾一下异或运算的基本概念。异或运算符在C语言中是^,它是一个位运算符,对两个整数的每一位进行运算异或的规则是相同为0,不同为1。比如,0^0是0,1^1是0,而0^1和1^0都是1。这一点我记得没错吧?根据引用中的例子,比如5(0101)异或3(0011)得到6(0110),确实是每一位分别异或的结果。 接下来,我需要整理异或运算的几个常见应用场景。用户的问题里提到了使用异或实现加法、数据交换和找缺失数等例子。引用里的例子也提到了这些应用。比如,引用2中通过异或和按位进位来实现加法,引用3中的缺失数问题使用异或来找出未出现的数字。还有引用4可能涉及到位操作的其他应用,但用户的问题主要集中在异或上。 然后,我需要确保每个示例的代码和解释正确。例如,交换两个变量的时,传统方法是用临时变量,而用异或的话可以不用临时变量。但是要注意,如果两个变量指向同一个内存地址,这种方法会失败,导致结果为零。这一点需要说明清楚,避免用户误用。 另外,关于缺失数的例子,力扣题目中的解法是通过异或0到n的所有数和数组中的每个数,最后结果就是缺失的那个数。引用3中的代码示例是正确的,但需要解释清楚原理:因为异或同一个数两次会抵消,最终剩下的就是缺失的那个数。 还有,可能用户会关心异或运算的其他用途,比如加密、校验等,但根据提供的引用,主要需要覆盖加法、交换、缺失数这三个方面。不过如果有余力的话,可以简要提及其他应用,但可能引用中没有相关内容,所以需要谨慎。 在组织回答时,要分点说明,每个应用场景给出代码示例和解释,并确保代码语法正确。例如,交换变量的代码需要展示如何通过三次异或操作实现交换,并指出潜在的问题。 最后,生成的相关问题需要基于用户的引用和回答内容,可能包括异或的其他应用、性能分析、优化方法等。比如,如何用异或进行加密,或者异或在位操作中的其他技巧。 现在需要检查是否有遗漏或错误。例如,异或实现加法的方法是否正确?引用2中的代码示例是使用异或计算无进位和,然后计算进位并异或结果循环相加,直到没有进位。这个过程需要详细解释,但用户可能只需要示例和简要说明。此外,异或运算的优先级和结合性是否需要提及?可能在注意事项里提到运算符优先级的问题,避免用户混淆。 总结一下,回答的结构应该是:基本概念、常见应用(每个应用有示例代码和解释)、注意事项、相关问题。这样结构清晰,符合用户的要求,并且引用相关的例子来支持每个观点。</think>### C语言异或运算详解 #### 一、基本概念 异或运算符 `^` 是C语言中的**位运算符**,遵循以下规则: - 相同位异或结果为 `0`(如 `0^0=0`,`1^1=0`) - 不同位异或结果为 `1`(如 `0^1=1`,`1^0=1`) 示例: ```c int a = 5; // 二进制:0101 int b = 3; // 二进制:0011 int result = a ^ b; // 二进制:0110 → 十进制6 [^1] ``` --- #### 二、常见应用场景 ##### 1. 变量交换(无需临时变量) 通过三次异或操作交换两个变量: ```c int x = 10, y = 20; x = x ^ y; // x存储异或结果 y = x ^ y; // y恢复为原x x = x ^ y; // x恢复为原y ``` *注意事项*:若 `x` 和 `y` 指向同一内存地址,会导致结果归零[^3]。 --- ##### 2. 实现加法运算 利用异或和进位计算实现加法: ```c int add(int a, int b) { while (b != 0) { int sum = a ^ b; // 无进位加法结果 int carry = (a & b) << 1; // 进位 a = sum; b = carry; } return a; } ``` 原理:异或运算计算无进位和,运算左移1位计算进位,循环直至无进位[^2]。 --- ##### 3. 查找缺失数字 在 `[0, n]` 范围内查找缺失的整数: ```c int missingNumber(int* nums, int numsSize) { int target = 0; for (int i = 0; i < numsSize; i++) { target ^= i; // 异或0到n-1 target ^= nums[i]; // 异或数组元素 } target ^= numsSize; // 最后异或n return target; } ``` 原理:成对异或后剩余为缺失数字[^3]。 --- #### 三、注意事项 1. **类型限制**:仅适用于整型(`int`, `char` 等) 2. **优先级问题**:异或优先级低于比较运算符,需用括号明确运算顺序 3. **可读性**:复杂异或逻辑需添加注释说明 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值