“逻辑异或”进行数值交换的过程分析
1、逻辑异或
运算符:^
两个操作数相同,结果为 false( 0 )
两个操作数不同,结果为 true( 1 )
2、逻辑异或代码操作实例与具体分析(正数与正数、正数与负数、负数与负数)
- 2.1 案例(正数与正数)
1 int a = 2; 2 int b = 7; 3 4 system.out.println("未进行逻辑异或前:a=" + a + "、b=" + b); 5 6 a = a ^ b; 7 b = a ^ b; 8 a = a ^ b; 9 10 system.out.println("已进行逻辑异或后:a=" + a + "、b=" + b);
变量 a ( 2 ):0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ( 原码 亦为 补码 )
变量 b ( 7 ):0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 ( 原码 亦为 补码 )
注:int 型变量 4 字节,占 32 位
正数补码即为原数值原码。因此在以下解释中除去部分零,不影响最终结果。
( 1 )a = a ^ b ;
运 行 过 程 解 析 |
( a ^ b )^ a = 0 1 0 1 ^ 0 0 1 0 = 0 1 1 1 = b( 7 ) ( a ^ b )^ b = 0 1 0 1 ^ 0 1 1 1 = 0 0 1 0 = a( 2 ) a = a ^ b = 0 1 0 1 |
执行完此句代码后 |
a :0 1 0 1 改变 |
||
b :0 1 1 1 未改变 |
( 2 )b = a ^ b ;
运 行 过 程 解 析 |
b = a ^ b = 0 1 0 1 ^ 0 1 1 1 = 0 0 1 0 = 2 ( 原变量 a 的初始值 ) |
执行完此句代码后 |
a :0 1 0 1 未改变 |
||
b :0 0 1 0 改变 |
( 3 )a = a ^ b ;
运 行 过 程 解 析 |
a = a ^ b
= 0 1 0 1 ^ 0 0 1 0 = 0 1 1 1 = 7 ( 原变量 b 的初始值 ) |
执行完此句代码后 |
a :0 1 1 1 改变 |
||
b :0 0 1 0 未改变 |
- 2.2 案例(正数与负数)
1 int a = -2; 2 int b = 7; 3 4 system.out.println("未进行逻辑异或前:a=" + a + "、b=" + b); 5 6 a = a ^ b; 7 b = a ^ b; 8 a = a ^ b; 9 10 system.out.println("已进行逻辑异或后:a=" + a + "、b=" + b);
变量 a ( -2 ): 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ( 原码 )
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 ( 反码 )
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 ( 补码 )
变量 b ( 7 ): 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 ( 原码、补码 )
注:int 型变量 4 字节,占 32 位
对于负数即有符号位数值而言,反码( 原码符号位不变,其余位取反 ),补码( 反码加 1 )
计算后若符号位为 0 则该数原码为补码本身。
计算后若符号位为 1 则需要转换为原码取值。( 除符号位 取反 加 1 )
( 1 )a = a ^ b ;
运 行 过 程 解 析 |
( a ^ b )^ a = 1 · · 1 0 0 1 ^ 1 · · 1 1 1 0 = 0 · · 0 1 1 0( 无符号位补码 ) = b( 7 ) ( a ^ b )^ b = 1 · · 1 0 0 1 ^ 0 · · 0 1 1 1 = 1 · · 1 1 1 0 ( 有符号位补码 ) = 1 · · 0 0 1 0 ( 原码 ) = a( -2 ) a = a ^ b = 1 · · 1 0 0 1 |
执行完此句代码后 |
a :1 · · 1 0 0 1 改变 |
||
b :0 · · 0 1 1 1 未改变 |
( 2 )b = a ^ b ;
运 行 过 程 解 析 |
b = a ^ b = 1 · · 1 0 0 1 ^ 0 · · 0 1 1 1 = 1 · · 1 1 1 0 ( 有符号位补码 ) = 1 · · 0 0 1 0 ( 原码 ) = -2 ( 原变量 a 的初始值 ) |
执行完此句代码后 |
a :1 · · 1 0 0 1 未改变 |
||
b :1 · · 1 1 1 0 改变 |
( 3 )a = a ^ b ;
运 行 过 程 解 析 |
a = a ^ b
= 1 · · 1 0 0 1 ^ 1 · · 1 1 1 0 = 0 · · 0 1 1 1 ( 无符号位补码 ) = 7 ( 原变量 b 的初始值 ) |
执行完此句代码后 |
a :0 · · 0 1 1 1 改变 |
||
b :1 · · 1 1 1 0 未改变 |
- 2.3 案例(负数与负数)
1 int a = -2; 2 int b = -7; 3 4 system.out.println("未进行逻辑异或前:a=" + a + "、b=" + b); 5 6 a = a ^ b; 7 b = a ^ b; 8 a = a ^ b; 9 10 system.out.println("已进行逻辑异或后:a=" + a + "、b=" + b);
变量 a ( -2 ): 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ( 原码 )
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 ( 反码 )
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 ( 补码 )
变量 b ( -7 ): 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 ( 原码 )
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 ( 反码 )
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 ( 补码 )
注:int 型变量 4 字节,占 32 位
对于负数即有符号位数值而言,反码( 原码符号位不变,其余位取反 ),补码( 反码加 1 )
计算后若符号位为 1 则需要转换为原码取值。( 除符号位 取反 加 1 )
( 1 )a = a ^ b ;
运 行 过 程 解 析 |
( a ^ b )^ a = 0 · · 0 1 1 1 ^ 1 · · 1 1 1 0 = 1 · · 1 0 0 1( 有符号位补码 ) = 1 · · 0 1 1 1( 原码 ) = b( -7 ) ( a ^ b )^ b = 0 · · 0 1 1 1 ^ 1 · · 1 0 0 1 = 1 · · 1 1 1 0 ( 有符号位补码 ) = 1 · · 0 0 1 0 ( 原码 ) = a( -2 ) a = a ^ b = 0 · · 0 1 1 1 |
执行完此句代码后 |
a :0 · · 0 1 1 1 改变 |
||
b :1 · · 1 0 0 1 未改变 |
( 2 )b = a ^ b ;
运 行 过 程 解 析 |
b = a ^ b = 0 · · 0 1 1 1 ^ 1 · · 1 0 0 1 = 1 · · 1 1 1 0 ( 有符号位补码 ) = 1 · · 0 0 1 0 ( 原码 ) = -2 ( 原变量 a 的初始值 ) |
执行完此句代码后 |
a :0 · · 0 1 1 1 未改变 |
||
b :1 · · 1 1 1 0 改变 |
( 3 )a = a ^ b ;
运 行 过 程 解 析 |
a = a ^ b
= 0 · · 0 1 1 1 ^ 1 · · 1 1 1 0 = 1 · · 1 0 0 1 ( 有符号位补码 ) = 1 · · 0 1 1 1 ( 原码 ) = -7 ( 原变量 b 的初始值 ) |
执行完此句代码后 |
a :1 · · 1 0 0 1 改变 |
||
b :1 · · 1 1 1 0 未改变 |
上一篇: 秦孝公死前留给商鞅什么密诏 为何他被车裂时都没有拿来救命呢
下一篇: 前端面试week2