关于异或交换数字的问题
来源:互联网 发布:金融计算器软件 编辑:程序博客网 时间:2024/05/21 12:48
原来写交换两个数字时就喜欢这么写:
*a ^= *b;
*b ^= *a;
*a ^= *b;
感觉很酷,但是不知道为什么可以交换...
看了那本深入理解计算机系统才知道
原来是这样啊:
*a ^= *b; 以后:a变为 a^b, b没变
*b ^= *a; 以后:a为还a^b,b为((a^b)^b)就是a
*a ^= *b; 以后:a变为(a^b)^a,就是b,b还是a
呵呵,是一个数学原理...
可是这个小东西不是太通用,比如
#include <stdio.h>
void swap(int *a ,int *b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
int main()
{
int a=9;
swap(&a,&a);
printf("%d \n",a);
return 0;
}
结果就有点奇怪了,如果从过程上看:
*a ^= *b; 就是 0000 0000 0000 1001和0000 0000 0000 1001异或,*a变为了0
*b ^= *a; 就是 0000 0000 0000 0000和0000 0000 0000 0000异或,*a变为了0
*a ^= *b; 还是上一句,那么*a就永远变为了0
看来这个方法无法交换自身,应该谨慎的使用.
*a ^= *b;
*b ^= *a;
*a ^= *b;
感觉很酷,但是不知道为什么可以交换...
看了那本深入理解计算机系统才知道
原来是这样啊:
*a ^= *b; 以后:a变为 a^b, b没变
*b ^= *a; 以后:a为还a^b,b为((a^b)^b)就是a
*a ^= *b; 以后:a变为(a^b)^a,就是b,b还是a
呵呵,是一个数学原理...
可是这个小东西不是太通用,比如
#include <stdio.h>
void swap(int *a ,int *b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
int main()
{
int a=9;
swap(&a,&a);
printf("%d \n",a);
return 0;
}
结果就有点奇怪了,如果从过程上看:
*a ^= *b; 就是 0000 0000 0000 1001和0000 0000 0000 1001异或,*a变为了0
*b ^= *a; 就是 0000 0000 0000 0000和0000 0000 0000 0000异或,*a变为了0
*a ^= *b; 还是上一句,那么*a就永远变为了0
看来这个方法无法交换自身,应该谨慎的使用.
- 关于异或交换数字的问题
- 关于交换两个变量的不用第三个变量 异或的问题
- 007.利用异或进行数字交换
- 关于使用异或完成两个数的交换
- 关于数字或字母转unicode的问题
- 用异或实现两个数的交换的问题
- 异或操作交换元素容易产生的问题
- 异或操作交换元素容易产生的问题
- 笔记一 2.1.8异或交换产生的问题
- 通过异或^交换指针所指数据出现的问题
- 关于变量交换(异或)
- 一个看似简单的数字交换问题
- 用异或运算实现两个数字的交换(装x)
- 异或规则及实现两数字交换
- [技术讨论]关于交换编程实践的交换周期问题
- 关于通过异或交换两个元素的值的一个陷阱
- 关于异或运算的一个问题
- 不使用第三个参数和库函数实现两个数字的交换(异或的妙用)
- html表单 经典
- 【灵修】心动,何以平静
- 我怎样做交互【交互设计】
- 使用GDAL将12bit量化图像转为16bit或者8bit
- jQuery Ajax 实例演示-获取json数据
- 关于异或交换数字的问题
- List的简单使用
- 移动界面隐喻设计
- oracle执行计划
- 【灵修】开启你智慧之门
- csdn小感
- 读取Txt文件到数据库中
- csdn小感2
- Android中的界面组成