用异或交换两个整数的陷阱
来源:互联网 发布:淘宝店铺名字怎么修改 编辑:程序博客网 时间:2024/05/16 03:51
前面我们谈到了,可用通过异或运算交换两个数,而不需要任何的中间变量。 如下面:
- void exchange(int &a, int &b)
- {
- a ^= b;
- b ^= a;
- a ^= b;
- }
然而,这里面却存在着一个非常隐蔽的陷阱。
通常我们在对数组进行操作的时候,会交换数组中的两个元素,如exchang(&a[i], &b[j]), 这儿如果i==j了(这种情况是很可能发生的),得到的结果就并非我们所期望的。
- void main()
- {
- int a[2] = {1, 2};
- exchange(a[0], a[1]); //交换a[0]和a[1]的值
- printf("1---a[0]=%d a[1]=%d\n", a[0], a[1]);
- exchange(a[0], a[0]); //将a[0]与自己进行交换
- printf("2---a[0]=%d a[1]=%d\n", a[0], a[1]);
- }
- 1---a[0]=2 a[1]=1
- 2---a[0]=0 a[1]=1
- a ^= a;
- a ^= a;
- a ^= a;
既然这样,我们就不能够在任何使用交换的地方采用异或了,即使要用,也一定要在交换之前判断两个数是否指向同一个地址,如下:
- void exchange(int &a, int &b)
- {
- if(&a == &b) return; //防止&a,&b指向同一个地址;那样结果会错误。
- a ^= b;
- b ^= a;
- a ^= b;
- }
- 用异或交换两个整数的陷阱
- 用异或交换两个整数的陷阱
- 用异或交换两个整数的陷阱
- 用异或交换两个整数的陷阱
- 用异或交换两个整数的陷阱
- 用异或交换两个整数的陷阱
- 用异或进行两个数交换的陷阱
- 异或运算进行整数交换的陷阱
- java异或运算交换两个数的陷阱
- 异或运算实现两个整数的交换
- 通过异或运算交换两个整数的值
- 异或运算交换两个整数
- 按位异或交换两个变量时的一个陷阱
- 异或交换两数的陷阱
- 关于通过异或交换两个元素的值的一个陷阱
- 关于异或的用法1交换整数(注意陷阱)2求整数序列中差的一个值
- 将两个数交换的3种方法(异或法有陷阱!)
- java异或交换两个整数或字符串原理
- suggest类似百度下拉框的开源实现
- TNSPING1521速度慢 数据库登录速度慢的解决办法
- FS寄存器
- 如何成为一名优秀的C程序员
- .NET 4.0 和 .NET 4.0 Client Profile 区别
- 用异或交换两个整数的陷阱
- <s:if>标签判断<s:iterator>模拟循环的当前迭代值
- 完美解决android电子市场不能下载,Gtalk、Gmail不能正常使用
- Mysql 输入中文乱码
- SAD Pattern: Simple API for Datagram
- 阻塞和非阻塞语句区别
- C++,局部变量在栈上的地址,Release 和 Debug版本是不一样的
- kindle 资源整理 (将持续更新)
- GetFLV.v9.1.1.8-kg-REPT