`
argel_lj
  • 浏览: 356865 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

交换两个值,不用临时变量(C位运算)

 
阅读更多

    通常我们交换两个值,都是用一个临时的变量temp,拿交换a,b的值为例,通常的做法是:temp = a;a = b;b = temp;不过利用位运算,真的是方便很多:
        假如 a = 3,b = 4。想将a和b的值互换,可以用一下赋值语句实现:

        a = a ^ b;
        b = b ^ a;
        a = a ^ b;

        下面用竖式进行简单说明:(10进制化为二进制)
    
        a = 011
(^)    b = 100
则    a = 111(a ^ b的结果赋值给a,a已变成了7)
(^)    b = 100
则    b = 011(b^a的结果赋给b,b已经变成了3)
(^)    a = 111
则    a = 100(a^b的结果赋给a,a已经变成了4)    

        从上面的竖式可以清楚的看到利用异或运算实现两个值交换的基本过程。
       
        下面从深层次剖析一下:

        1.对于开始的两个赋值语句,a = a ^ b,b = b ^ a,相当于b = b ^ (a ^ b) = a  ^ b ^ b,而b ^ b 显然等于0。因此b = a ^ 0,显然结果为a。
        2. 同理可以分析第三个赋值语句,a = a ^ b = (a ^ b) ^ a = b

        注:1.^ 即”异或“运算符。它的意思是判断两个相应的位值是否为”异“,为”异"(值不同)就取真(1);否则为假(0)。
                2.^运算符的特点是与0异或,保持原值;与本身异或,结果为0。

 

另外,还可以通过加减的方式来交换两个值,如下:

a = a + b; 
b = a - b; 
a = a - b; 

分享到:
评论

相关推荐

    用位运算交换数字

    不用零食变量交换两个数字,简单明了,节省内存空间

    JavaScript两个变量交换值的实现方法

    本文主要描述,如何不使用中间值,将两个变量的值进行交换。 一、普通做法 var a = 1, b = 2, tmp; tmp = a; a = b; b = tmp; 普通的做法就是声明多一个临时变量tmp,进行数据交换过程中的缓存。这样的做法直观...

    Java不使用中间变量交换两个数

    在程序中实现交换两个数的功能并不复杂,但如果不使用中间变量,需要动一下脑筋。在本文介绍了两个方法(其实原理都是一个)。其基本原理是数的中和。也是说,通过某种运算(二元运算)将a和b两个数变成一个数,并...

    最简单的交换两个整数算法

    不用定义中间变量,仅使用位运算来实现两个整数的交换

    单片机C51位运算应用技巧

    位运算应用口诀: 清零取位要用与,某位置一可用或,若要取反和交换,轻轻松松用异或! 移位运算要点 1 它们都是双目运算符,两个运算分量...2 不引入第三变量,交换两个变量的值 (设 a=a1,b=b1) 目标 操作 操作后状

    java基础编程题源码.zip

    1.定义两个int 类型的变量 a 和 b ,分别打印输出a与b的‘加/减/乘/除/取余’的结果。2.定义一个int类型的变量 i ,输出这个...7.任意定义两个int类型的变量a=13和b=7,交换a和b的值,并打印交换后的结果(两种方法)

    Java位运算的应用

    (9)不用temp交换两个整数 void swap(int x , int y) { x ^= y; y ^= x; x ^= y; } (10)计算绝对值 int abs( int x ) { int y ; y = x >> 31 ; return (x^y)-y ; //or: (x+y)^y } (11)取模运算转化...

    JavaScript程序设计课件:基本语法综合练习.pptx

    1、交换两个变量的值 2.4. 综合练习 1、交换两个变量的值 案例分析: 需要一个空的临时变量; 把变量1给临时变量; 把变量2给变量1; 把临时变量的值给变量2. 2.4. 综合练习 2、根据输入的年份计算年龄 在页面中弹出...

    Python实现变量数值交换及判断数组是否含有某个元素的方法

    先说变量数值交换,从C语言开始,我们就知道要先设置一个临时变量,再把某元素的值覆盖此临时变量,避免临时覆盖等,如果不设置临时变量,还有位运算的交换形式 然而Python中根本就不用这么复杂,如果要交换变量e1,...

    JS实现不用中间变量temp 实现两个变量值得交换方法

    1.使用加减法; var a=1; var b=2; a=a+b; b=a-b;...2.使用乘除法(乘除法更像是加...以上所述是小编给大家介绍的JS实现不用中间变量temp 实现两个变量值得交换方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言

    C++使用异或运算实现交换两个数的值

    交换两个数的值,通常用利用一个变量来交换数值,异或交换两个数的值是资源开销最小的方法,不需要中介数,原理简单的来说就是异或的负负得正

    Colennn#HelloWorld#进制、位运算及其运用1

    运算位运算应用:1.数据加密:​ 一个数据对想用的数据异或^两次,其值不变2.两个变量值的交换:原码、反码和补码原码:二进制,最高为符号位,0为正数,1为负数​

    java异或-Java异或运算总结.pdf

    例⼀:在不引⼊第三个变量的情况下,两个变量的值(整数) //交换a、b的值 例⼆:判断奇数偶数更简单更⾼效的做法 //这个实际考的不多, 太简单 //思路:奇数的⼆进制最低为⼀定为1,偶数的⼆进制最低位⼀定为0, a^...

    指针、引用、结构体、线性表(顺序表、单向链表)

    (1)使用指针和引用两种方式,完成两个学生的交换。 (2)定义一个结构体类型student,写一个函数,根据学号或者成绩,对包含有n个学生的结构体数组进行排序,学生的结构体至少包括3个成员(学号,姓名,入学分数等...

    C语言程序设计-大一实验报告1-10-长春工程学院

    1. 交换两个变量的值,需要借助第三个变量; 2. 大小写字母之间的ASCII码相差32; 3. 在用scanf()函数输入时,如果格式控制字符串中有其他字符,应原样输入; 4. 输入整数用%d,输入单精度实数用%f,输入字符用%c; ...

    c程序设计习题参考(谭浩强三版)习题参考解答

    请编一程序,用赋初值的方法使c1,c2,c3,c4,c5这5个变量的值分别为’C’,’h’,’i’,’n’,’a’,经过运算,使c1,c2,c3,c4,c5的值分别变为’G’,’l’,’m’,’r’,’e’,并输出。 4 3.8例2.6能否改成...

    你必须知道的495个C语言问题

    3.18 需要根据条件把一个复杂的表达式赋给两个变量中的一个。可以用下面这样的代码吗?((condition)?a:b)=complicated_expression; 3.19 我有些代码包含这样的表达式。a?b=c:d有些编译器可以接受,有些却不能。为...

Global site tag (gtag.js) - Google Analytics