一、C 中交换两个整数的4种方式
在C和C 中交换两个整数有多种方式,我想到的常用方法有以下4种:
1、使用引用传参
2、使用指针传参
3、利用位异或运算符^的特性,并结合引用传参
4、利用加减减运算符,并结合引用传参
当然在C/C 以及Java中直接使用int作为形参进行值传递是无法交换两个整数的,相关的C 测试代码如下:
代码语言:javascript复制// swap1.cpp
#include <iostream>
int swap1(int a, int b)
{
int tmp = a;
b = a;
a = tmp;
}
int main(int argc, char* argv[])
{
int x = 12;
int y = 34;
std::cout << "交换前,x=" << x << ",y=" << y << std::endl;
swap1(x,y);
std::cout << "交换后,x=" << x << ",y=" << y << std::endl;
return 0;
}
下面是我在腾讯云CentOS7主机下的运行结果截图:
可以看出直接使用int作为形参传递是无法交换两个整数的。
1、使用引用传参
// swap2.cpp
代码语言:javascript复制#include <iostream>
int swap2(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
int main(int argc, char* argv[])
{
int x = 12;
int y = 34;
std::cout << "交换前,x=" << x << ",y=" << y << std::endl;
swap2(x,y);
std::cout << "交换后,x=" << x << ",y=" << y << std::endl;
return 0;
}
测试结果截图:
2、使用指针传参
// swap3.cpp
代码语言:javascript复制#include <iostream>
int swap3(int* pA, int* pB)
{
int tmp = *pA;
*pA = *pB;
*pB = tmp;
}
int main(int argc, char* argv[])
{
int x = 12;
int y = 34;
std::cout << "交换前,x=" << x << ",y=" << y << std::endl;
swap3(&x,&y);
std::cout << "交换后,x=" << x << ",y=" << y << std::endl;
return 0;
}
测试结果截图如下:
3、利用位异或运算符^的特性,并结合引用传参
// swap4.cpp
代码语言:javascript复制#include <iostream>
int swap4(int& a, int& b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
int main(int argc, char* argv[])
{
int x = 12;
int y = 34;
std::cout << "交换前,x=" << x << ",y=" << y << std::endl;
swap4(x,y);
std::cout << "交换后,x=" << x << ",y=" << y << std::endl;
return 0;
}
测试结果截图如下:
上面是利用了位异或运算的特性:一个数据对两一个数据位异或两次,该数本身不变。
int a = 12;
int b = 34;
// 交换两个整数
a = a ^ b; // a = 12^34
b = a ^ b; // b = 12 ^ 34^34=12
a = a ^ b; // a = 12^ 34 ^12 = 34
4、利用加减减运算符,并结合引用传参
// swap4.cpp
代码语言:javascript复制#include <iostream>
int swap4(int& a, int& b)
{
a = a b;
b = a - b;
a = a - b;
}
int main(int argc, char* argv[])
{
int x = 12;
int y = 34;
std::cout << "交换前,x=" << x << ",y=" << y << std::endl;
swap4(x,y);
std::cout << "交换后,x=" << x << ",y=" << y << std::endl;
return 0;
}
测试代码运行结果如下图所示:
最终的完整的测试代码如下:
代码语言:javascript复制#include <iostream>
using namespace std;
// 直接使用int值作为参数,交换不成功
void swap1(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
// 使用引用传参,可以交换
void swap2(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
// 使用指针传参,可以交换
void swap3(int* pA, int* pB)
{
int tmp = *pA;
*pA = *pB;
*pB = tmp;
}
// 利用位异或运算符传参,可以交换
int swap4(int& a, int& b)
{
// 假如int a=11; int b=22;
a = a ^ b; // a = 11 ^ 22;
b = a ^ b; // b = 11 ^ 22 ^ 22 = 11;
a = a ^ b; // a = 11 ^ 22 ^ 11 = 22;
}
int main(int argc, char* argv[])
{
int a1 = 10;
int b1 = 20;
std::cout << "交换前:a1=" << a1 << ",b1=" << b1 << std::endl;
// 方式1:传值
swap1(a1,b1);
std::cout << "-------------方式一:直接传值 调用swap1(a1,b1) ------------------------------" << std::endl;
std::cout << "交换后:a1=" << a1 << ",b1=" << b1 << std::endl;
// 方式二:传引用
swap2(a1,b1);
std::cout << "------------- 方式二:传引用 调用swap2(a1,b1) ------------------------------" << std::endl;
std::cout << "交换后:a1=" << a1 << ",b1=" << b1 << std::endl;
// 方式三:传指针
swap3(&a1,&b1);
std::cout << "------------- 方式三:传指针参数 调用swap3(&a1,&b1) ------------------------------" << std::endl;
std::cout << "交换后:a1=" << a1 << ",b1=" << b1 << std::endl;
// 方式四:使用位异或运算符
swap4(a1,b1);
std::cout << "------------- 方式四:使用位异或运算 调用swap4(a1,b1) ------------------------------" << std::endl;
std::cout << "交换后:a1=" << a1 << ",b1=" << b1 << std::endl;
return 0;
}
在腾讯云主机的CentOS7下的测试截图如下:
Java中交换两个整数的值
Java中由于不存在引用传参和指针传参,交换两个整数有以下两种方法:
1、通过一个中间变量进行交换
2、使用位异或运算符
3、使用加减减的运算操作
1、使用中间变量交换两个整数
相关的代码如下:
代码语言:javascript复制public class Demo01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int x = 10;
int y = 8;
System.out.println("交换前:");
System.out.println("x=" x ",y=" y);
// 使用变量tmp进行中间交换
int tmp = x;
x = y;
y = tmp;
System.out.println("交换后:");
System.out.println("x=" x ",y=" y);
}
}
在Eclipse中的运行截图结果如下:
2、使用位异或运算符交换两个整数
对应的java代码如下:
代码语言:javascript复制public class Demo02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
/**
* 一、请自己实现两个整数变量的交换(不需要定义第三方变量)
* 考点:位异或运算符的特点:
* ^的特点:一个数据对两一个数据位异或两次,该数本身不变
*/
int x = 11;
int y = 12;
System.out.println("x=" x ",y=" y);
x = x ^ y;
y = x ^ y;
x = x ^ y;
System.out.println("x=" x ",y=" y);
}
}
在Eclipse中的运行结果截图如下:
3、使用加减减的运算操作
对应的Java代码如下:
代码语言:javascript复制package Lesson03;
public class Demo03 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 12;
int b = 34;
System.out.println("交换前:a=" a ",b=" b);
// 交换两个整数
a = a b; // a = (12 34) = 46
b = a - b; // b = (12 34) - 34 = 12
a = a - b; // a = (12 34) - 12 = 34
System.out.println("交换后:a=" a ",b=" b);
}
}
Eclipse中测试结果如下图所示:
但是在Java中使用上述两种方法交换两个整数,不太好封装成方法,这点可以通过数组传参来实现,这个可以参考我很早以前的一篇博客有关Java中两个整数的交换问题