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

2020-02-14 17:33:58 浏览数 (1)

一、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中两个整数的交换问题

0 人点赞