前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++和Java中交换两个整数的方法

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

作者头像
ccf19881030
发布2020-02-14 17:33:58
1.6K0
发布2020-02-14 17:33:58
举报
文章被收录于专栏:ccf19881030的博客ccf19881030的博客

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、C++中交换两个整数的4种方式
    • 1、使用引用传参
      • 2、使用指针传参
        • 3、利用位异或运算符^的特性,并结合引用传参
          • 4、利用加减减运算符,并结合引用传参
          • Java中交换两个整数的值
            • 1、使用中间变量交换两个整数
              • 2、使用位异或运算符交换两个整数
                • 3、使用加减减的运算操作
                相关产品与服务
                云服务器
                云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档