zoukankan      html  css  js  c++  java
  • 转:用异或实现两个数的交换的问题

    void swap(int &a,int &b)
    {
    a^=b;
    b^=a;
    a^=b;
    }

    ^ 在 C 里面是按位异或操作符。异或运算的原理应该清楚吧?相同的话异或的结果就是 0,不同的话就是 1。举个例子,比如 a 表示十进制的 5,b 表示十进制的 12,按位异或结果就是:

    1. a = 0101   (5 的二进制表示)
    2. b = 1100   (12 的二进制表示)
    3.     ----
    4. c = 1001   (结果为 9)
    复制代码


    可以看出 c 中是 1 的部分就是 a 和 b 二进制表示对应位不同的部分,0 则是相同的部分。

    然后有两个定理:
    任何一位二进制数同 1 异或都会变成另外一个(0 同 1 异或的结果是 1,1 同 1 异或的结果是 0)
    任何一位二进制数同 0 异或都保持不变(0 同 0 异或的结果是 0,1 同 0 异或的结果是 1)

    因为 c 中是 1 的部分表示 a 和 b 中按位不同的位,0 表示 a 和 b 中按位相同的位,那么 a 同 c 异或的结果就是 a 中与 b 不同的位发生变化,二进制数每位只有两种状态,所以 a 变成了 b:

    1. a = 0101
    2. c = 1001
    3.     ----
    4. b = 1100
    复制代码



    同样, b 与 c 异或结果就变成了 a:

    1. b = 1100
    2. c = 1001
    3.     ----
    4. a = 0101
    复制代码
  • 相关阅读:
    退出窗口时出现“当”的响声
    屏幕设备环境
    修改一个完全颜色的CListCtrl类
    修改一个完全颜色的CListCtrl类
    MFC中CString.Format的详细用法
    网上阅卷系统自动识别功能代码
    mfc 子对话框数据传给父对话框
    already defined in *.obj
    Object 的使用
    this 函数执行上下文
  • 原文地址:https://www.cnblogs.com/kira2will/p/4435418.html
Copyright © 2011-2022 走看看