“逻辑异或”进行数值交换的过程分析
2019-11-19 16:06:58来源:博客园 阅读 ()
“逻辑异或”进行数值交换的过程分析
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 未改变 |
原文链接:https://www.cnblogs.com/debjJava/p/11890350.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Java Stream 流如何进行合并操作 2020-05-12
- 用一张表来存储数据状态,并且可以进行多状态精确查询;使用 2020-04-30
- JSR 303 进行后台数据校验 2020-04-28
- Java的外部类为什么不能使用private、protected进行修饰 2020-04-28
- Docker安装Redis并介绍漂亮的可视化客户端进行操作 2020-04-21
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash