zoukankan      html  css  js  c++  java
  • 不用临时变量,交换二个整型变量的值

    早上出门前看时间还早,反正出去等公交也是等,就捞起垫桌脚的一本书(C程序设计),随便翻了翻,看到下面这个方法,记录下来,说不定哪天就用到了:

    using System;
    
    namespace test
    {
        class Program
        {
            static void Main(string[] args)
            {
                int x = 3;
                int y = 4;
    
                Console.WriteLine("x={0},y={1}", x, y);//x=3,y=4
    
                x = x ^ y;
                y = y ^ x;
                x = x ^ y;
    
                Console.WriteLine("x={0},y={1}", x, y);//x=4,y=3
    
                Console.WriteLine(1 ^ 0); //1
                Console.WriteLine(0 ^ 0); //0
                Console.WriteLine(1 ^ 1); //0
                Console.WriteLine(0 ^ 1); //1
    
                Console.ReadKey();
            }
        }
    }
    

    明白原理了吗?就是利用异或操作,从最后1,0异或操作的结算来看,异或操作有二个基本特性:

    1、满足交换律(即1^0 和 0^1结果相同)

    2、相同为0,相异为1(即不同为1)

    所以来仔细看下:

    x = x ^ y

    y = y ^ x 相当于 y = y ^ (x ^ y) = x ^ y ^ y (交换律) = x ^ 0 (y跟y相同,异或结果为0) = x (x跟0异或的结果,内部二进制中的每一位都不变,最终还是x)

    这样最终y的值就变成了x

    再继续

    x = x ^ y 相当于 x = (x ^ y) ^ (y ^ (x ^ y))-即把上面的公式继续替换过来 = x ^ x ^ y ^ y ^ y (交换律) =0^ y ^ 0 (最前面的x ^ x 为0,最后的 y ^ y也为0) = y

    这样最终x的值就变成了y

    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    更好地限制一个UITextField的输入长度
    训练集(train set) 验证集(validation set) 测试集(test set)
    主流机器学习[xgb, lgb, Keras, LR]
    python pandas (ix & iloc &loc) 的区别
    机器学习:数据预处理之独热编码(One-Hot)
    SPARK第一天
    Spark简介
    scatter
    协方差和相关关系
    SQL存储过程
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1885901.html
Copyright © 2011-2022 走看看