C++和Java中交换两个整数的方法

一、C++中交换两个整数的4种方式

在C和C++中交换两个整数有多种方式,我想到的常用方法有以下4种:
1、使用引用传参
2、使用指针传参
3、利用位异或运算符^的特性,并结合引用传参
4、利用加减减运算符,并结合引用传参
当然在C/C++以及Java中直接使用int作为形参进行值传递是无法交换两个整数的,相关的C++测试代码如下:

// 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主机下的运行结果截图:
swap1
可以看出直接使用int作为形参传递是无法交换两个整数的。

1、使用引用传参

// swap2.cpp

#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;
}

测试结果截图:
swap2

2、使用指针传参

// swap3.cpp

#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;
}

测试结果截图如下:
swap3

3、利用位异或运算符^的特性,并结合引用传参

// swap4.cpp

#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;
}

测试结果截图如下:
swap4
上面是利用了位异或运算的特性:一个数据对两一个数据位异或两次,该数本身不变。
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、利用加减减运算符,并结合引用传参

// swap5.cpp

#include <iostream>

int swap5(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;

	swap5(x,y);
		
	std::cout << "交换后,x=" << x << ",y=" << y << std::endl;
	
	return 0;
}

测试代码运行结果如下图所示:
swap5

最终的完整的测试代码如下:

#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 swap5(int& a, int& b)
{
	a = a + b;
	b = a - b;
	a = a - b;
}

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;
	
	// 方式五:使用加减减运算
	swap5(a1, b1);

	std::cout << "------------- 方式五:使用加减减运算 调用swap5(a1,b1) ------------------------------" << std::endl;
	std::cout << "交换后:a1=" << a1 << ",b1=" << b1 << std::endl;
	
	return 0;
}

在腾讯云主机的CentOS7下的测试截图如下:
swapDemo

Java中交换两个整数的值

Java中由于不存在引用传参和指针传参,交换两个整数有以下两种方法:
1、通过一个中间变量进行交换
2、使用位异或运算符
3、使用加减减的运算操作

1、使用中间变量交换两个整数

相关的代码如下:

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中的运行截图结果如下:
Demo01

2、使用位异或运算符交换两个整数

对应的java代码如下:

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中的运行结果截图如下:
Demo02

3、使用加减减的运算操作

对应的Java代码如下:

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中测试结果如下图所示:
Demo03

但是在Java中使用上述两种方法交换两个整数,不太好封装成方法,这点可以通过数组传参来实现,这个可以参考我很早以前的一篇博客有关Java中两个整数的交换问题

发布了107 篇原创文章 · 获赞 35 · 访问量 97万+

猜你喜欢

转载自blog.csdn.net/ccf19881030/article/details/104186254
今日推荐