`
Josh_Persistence
  • 浏览: 1651379 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

Java 使用异或交换两个整数或者字符串的用法及原理

阅读更多

Java交换两个数或字符串可以用temp来交换,如果不使用temp,有下面两种交换方法:

1.对于数来说,可以用如下方式来进行交换,原理就是用a来作为临时变量存储。

a = a + b; 
b = a - b;  // 此时的a的值是a+b,所以此时的b = a - b = a+b-b = a
a = a - b; // 此时a的值是a+b, b的值是a,所以此时的a= a - b = a+b -a = b

这样就实现了a和b的交换

 

2.更为通用的方法是用异或来交换

a=a^b; 
b=b^a; 
a=b^a;

 

 

异位运算交换两个整数的算法原理。

交换两个整数常规的实现就是使用临时变量,异位运算交换两个整数不需要临时变量,其实是把临时变量与其中的一个整数结合起来了,也就是说把其中的一个整数当做临时变量来用,这一点与两数相加减的算法是一到致的。下面讲讲原理。

异或运算有两个特性:

1、一个数异或本身恒等于0,如5^5恒等于0;

2、一个数异或0恒等于本身,如5^0恒等于5。

交换两个整数a和b,无非是a=b和b=a这两个操作,当然,你不能直接这么做。该怎么变呢?

算式一:a=b^(a^a)=a^(a^b);

算式二:b=a^(b^b)^(a^a)=a^(a^b)^(a^b);

注意上面算式二中的a还是原来的a,不要认为是改变后的a。

为什么右边的式子都留个a,没为什么,我就是想把b做为临时变量来用,此处要注意,既然做为临时变量用那么b就是最后才计算出来的数。接下来认真的分析下上面的两个算式。得出以下java语句:

把a^b做为临时变量值赋给b(临时变量),得

b=a^b;

计算出a:

a=a^b;注意这时的b可就是上面的式子已改变过的b了。

计算出b:

b=a^b;注意仔细观察上面的式二,此时a=a^(a^b), b=a^b, (红的为当前的a,b)

至此完成了两个整数的交换。

 

3
1
分享到:
评论

相关推荐

    java使用异或实现变量互换和异或加密解密示例

    我们可以使用`Scanner`读取整数、浮点数、字符串等不同类型的数据。例如: ```java Scanner sc = new Scanner(System.in); int i = sc.nextInt(); // 读取整数 String str = sc.nextLine(); // 读取一行文本 // 从...

    JAVA_MAC地址校验和转换

    - **二进制与十六进制转换**:可以使用`Integer.parseInt()`或`Long.parseLong()`方法配合`format()`函数将16进制字符串转换为二进制,反之亦然。 - **字符串与字节数组转换**:`getBytes("UTF-8")`可以将字符串...

    iava解惑,深入剖析java

    在Java中,交换两个变量的值通常是通过中间变量或位运算实现的。不使用额外变量的交换方法是通过异或操作:`a = a ^ b; b = a ^ b; a = a ^ b;` 谜题8:Dos Equis 这个谜题可能与字符串操作有关,例如拼接、查找、...

    java基础要点总结学习java必看.pdf

    例如,使用异或交换两个整数`n`和`m`的值: ```java n = n ^ m; m = n ^ m; n = n ^ m; ``` 9. **if和switch语句**:if语句适用于各种条件判断,而switch语句更适合于基于特定值(byte, short, int, char)的...

    大整数加减乘除运算

    以上就是大整数加减乘除运算的基本原理和实现方法,实际应用中还需结合特定的编程语言和库,例如Python的`decimal`模块、Java的`BigInteger`类等,它们提供了封装好的大整数操作接口,方便开发者使用。

    Java实现 LeetCode 541 反转字符串 II(暴力大法)

    在这个解决方案中,`swap`函数通过异或操作实现了两个位置的字符交换,这是无须额外空间的一种交换方式。`reverseStr`函数首先将输入字符串转换为字符数组,然后通过循环处理字符串的每个2k长度的子串。在循环中,...

    java的String用法类型总结

    上例展示了如何通过异或操作实现无临时变量的交换两个变量的值。 - 应用场景:位操作在计算机科学中应用广泛,例如在加密算法中。 #### 五、日期与时间 4. **闰年2月加一天的判断** - 示例代码:`if (year % 4 ==...

    《剑指Offer》Java代码(高清带目录) (1).pdf

    10. 二进制中1的个数:主要考察位运算的技巧,以及如何在不使用循环的情况下计算一个整数二进制表示中1的个数。 11. 数值的整数次方:涉及到数学运算和数值计算的知识,需要考虑大数运算以及溢出问题。 12. 求1到...

    《剑指Offer》题目及代码.pdf

    40. 数组中只出现一次的两个数,而其他数都出现两次:可以考虑使用异或运算的性质来找出成对的数字,然后通过异或运算找出只出现一次的数字。 41. 和为s的连续整数序列:可以使用滑动窗口的方法,维护一个窗口区间...

    数据结构与算法分析java课后答案.pdf

    使用异或运算符`^`可以无须临时变量实现两个整数的交换。例如: ```java int x=5, y=19; x = x ^ y; y = y ^ x; x = x ^ y; ``` 这段代码最终会将x的值赋给y,y的值赋给x。 9. 合法的标识符: Java中的...

    java经典50题

    本题要求比较两个字符串,需要掌握字符串比较的方法。 #### 题目四十五:素数判断 **知识点**:素数判断是确定一个数是否为素数的过程。本题要求判断一个数是否为素数,涉及到循环判断和数学运算。 #### 题目四十...

    JAVA学习笔记(全面)

    - **`String`类**:用于表示文本字符串,提供了一系列用于字符串操作的方法。 - **`StringBuilder`类**:用于创建和修改字符串,与`String`相比,在多线程环境中性能更高。 - **集合框架**:提供了存储和操作一组...

    字节类型转换及CRC32校验

    1. **字节到整数**: 使用`ByteBuffer`类的`asIntBuffer()`或`asLongBuffer()`方法,将字节数组视作一个整数或长整数的序列。 2. **整数到字节**: 反向操作,使用`ByteBuffer`的`putInt()`或`putLong()`方法,将整数...

    JAVA语言程序设计第六版编程答案第三章

    - **数据类型转换**:在本例中,`Integer.parseInt()`方法被用来将字符串转换为整数,这在处理用户输入时非常常见。 - **布尔表达式**:`isEven`方法返回一个布尔值,用于逻辑判断,是程序控制流的重要组成部分。 #...

    紫光华宇软件工程师笔试题

    4. **交换变量值**:在不使用额外变量的情况下,可以使用异或操作来交换两个整数变量`x`和`y`的值:`x = x ^ y; y = x ^ y; x = x ^ y;`。 5. **Spring依赖注入**:DI(Dependency Injection)有助于解耦代码,提高...

    Java基础整理

    - **String类**:字符串类,提供了丰富的字符串操作方法。 - **StringBuffer类**:可变字符串类,支持线程安全的操作。 - **StringBuilder类**:可变字符串类,非线程安全,性能优于`StringBuffer`。 - **基本数据...

    Java 加密解密之对称加密算法DES.doc

    5. 处理结果:可能需要将字节数组转换为十六进制字符串,或者进行其他格式的转换。 在示例代码`DESCoder.java`中,可以看到如何使用Java的加密API来实现DES加密解密的过程。注意,由于DES密钥长度仅为56位,它可能...

    leetcode_resolve.rar_Java编程_Java_

    字符串相乘**:该题要求计算两个大整数的乘积,Java中的动态规划或字符串处理技巧可以派上用场。 10. **48. 旋转图像**:这是一个二维数组操作问题,要求按照顺时针或逆时针方向旋转矩阵。Java中,可以使用两次...

Global site tag (gtag.js) - Google Analytics