c-*a1=*a1^*b1;这句的功能是什么

问题描述

*a1=*a1^*b1;这句的功能是什么

#include
int main(void)
{
int *a1,*b1,*c1,a,b,c;
a1=&a;
b1=&b;
c1=&c;
scanf("%d%d%d",a1,b1,c1);
if(*a1>*b1)
{
*a1=*a1^*b1;
*b1=*a1^*b1;
*a1=*a1^*b1;
}
if(*a1>*c1)
{
*a1=*a1^*c1;
*c1=*a1^*c1;
*a1=*a1^*c1;
}
if(*b1>*c1)
{
*b1=*b1^*c1;
*c1=*b1^*c1;
*b1=*b1^*c1;
}
printf("%d,%d,%d",*a1,*b1,*c1);

}

解决方案

这句代码是异或的意思,默认用二进制计算,1 1得0 ,0 0得 0 ,1 0 得1 ,0 1 得1,每个if语句其实是在交换两个数,整个代码实现的功能是三个数从小到大排序

解决方案二:

比如a=1,b=2
那按位表示a最低4位是: 0001
b最低4位是:0010

 *a1=*a1^*b1; //0001^0010=0011;  a1=0011
*b1=*a1^*b1; //0011^0010; b1=0001;
*a1=*a1^*b1; //0011^0001=0010; a1=0010

交换了一下a1和b1

解决方案三:

异或一个数两次就相当于没有。所以上面if里是在交换数据,程序是在排序。

解决方案四:

其实就是交换a1和b1,玩弄了一个技巧。这种炫技毫无必要。

老老实实写
temp = a1;
a1 = b1;
b1 = temp;
就可以了。

解决方案五:

这个程序的功能是实现a,b,c三个数的排序,从小到大输出。
a= a^b;
b=a^b;
a=a^b;
这三行代码能实现数据的交换~这是不新开辟内存空间,比如第三个变量temp实现内存数据交换的方式~
但感觉这里写饶了,还是我没理解其内在的深意?用三个指针a1,b1,c1来访问内存a,b,c实现数据交换~
*a= a;
*b= b;
*c= c;
还是上面三行代码(a= a^b; b=a^b; a=a^b;)
感觉没有必要用指针呢~

时间: 2024-09-04 21:24:04

c-*a1=*a1^*b1;这句的功能是什么的相关文章

C#组件系列 你值得拥有的一款Excel处理神器Spire.XLS_C#教程

前言:最近项目里面有一些对Excel操作的需求,博主想都没想,NPOI呗,简单.开源.免费,大家都喜欢!确实,对于一些简单的Excel导入.导出.合并单元格等,它都没啥太大的问题,但是这次的需求有两点是NPOI搞不定的: 1.导入Excel后,需要切割Excel的Sheet页,然后每个Sheet页单独生成一个PDF文件. 2.导出Excel的时候,项目里面需要将一些数据表格以图表的形式在Excel里面展示. 找了一圈资料,对于Excel生成pdf,网上的答案千篇一律:使用COM组件的方式,通过调

Oracle 数组的学习 小知识也要积累,养成好的学习态度_oracle

提叻一个代码段,要人帮助解释一下. 代码段如下: 复制代码 代码如下: declare type t_indexby is table of number index by binary_integer; type t_nesteed is table of number; type t_varray is varray(10) of number; v_indexby t_indexby; v_nested t_nested; v_varray t_varray; begin v_indexb

sprintf,snprintf的用法(可以作为linux中itoa函数的补充)【转】

转自:http://blog.csdn.net/educast/article/details/25068445 函数功能:把格式化的数据写入某个字符串 头文件:stdio.h 函数原型:int sprintf( char *buffer, const char *format [, argument] - ); 返回值:字符串长度(strlen)     MSDN中的例子如下 #include <stdio.h> void main( void ){char buffer[200], s[]

Java 中Log4j的使用详情

Log4j 真的很简单,简单到令人发指的地步.不是要记录日志吗?那就给你一个Log ,然后你用Log 来写东西就行了,先来一个完整类示例: package test; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class Test { static Log log = LogFactory.getLog (Test. class ); public voi

C++ 学习

  内联函数 inline 内联函数的函数体的限制 (1)   函数体不能含有复杂的结构控制语句,如while和switch,若包括的话,编译器将会将其视为普通函数: (2)   递归不能用于内联函数 (3)   内联函数只适用于小函数 内部函数(static) 外部函数(extern)   结构体(struct)和类(class)的差距 默认的访问权限不一致.        面向对象的三大特点:继承 封装 多态 基于对象   类的定义 访问控制: (1)      用private限定的成员成

如何在FOXPRO中實現人民幣大寫的轉換

FOXPRO中人民幣大寫轉換的實現 作者:   CCBZZP        FOXPRO在實現報表的功能是很強大的, 特別在現實的應用中會經常用到人民幣 大小寫轉換的問題, 在此我簡單介紹一下, 希望和大家一起探討, 以便共同進步! 共同 發展! 假如 變量 MONEY 是我們要轉換的參數,我們在程序(*.PRG)中這樣寫:   PARA MONEYIF MONEY>999999999.99    RETURN ('<數值大于拾億! >')ENDIFIF ABS(MONEY)<1 

ASP中函数调用对参数的影响

在ASP编程中,经常需要自己编写一些函数(或过程)来实现某些特定的功能,这时往往需要向函数(或过程)传递相应的参数在函数(或过程)中进行数据处理,即有可能需要保留或改变参数的值,下面有相关范例用下面的函数(TestAddress)就可以使一个函数多个返回值成为可能(一个函数返回值,多个参数改变后的值) 范例: <%@LANGUAGE="VBSCRIPT"%><%Option Explicit '=====================================

excel中怎么合并单元格

  EXCEL中合并单元格在什么地方? 1.单元格的合并:同时选中需要合并的单元格,然后按一下"格式"工具栏上的"合并及居中"按钮即可. 2.撤销单元格的合并:选中合并后的单元格,然后再按一下"格式"工具栏上的"合并及居中"按钮即可. 注意:如果是Excel2000及以前的版本,撤销单元格的合并需要这样操作:选中合并后的单元格,执行"格式→单元格"命令,打开"单元格格式"对话框,切换到&

到底什么是集群&amp;分布式

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 对于楼主这样工作一年的菜鸟,偶尔会看到一些文章标题带有"分布式""集群"关键字,然后就懵逼了.最近对这些概念进行了一定的了解,整理了一下思路,在这里分享给各位猿友.不足之处还望纠正,感谢. 事实上,在这一年的工作中,对一些分布式和集群技术也有一些接触,只是研究得并不深入.比如分布式服务框架Dubbo.搜索引擎Elasticsearch. 概念总是抽象的,配合实例