“逻辑异或”进行数值交换的过程分析

2019-11-19 16:06:58来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

“逻辑异或”进行数值交换的过程分析

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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:SpringCloud之Hystrix:集群容错框架

下一篇:算法源于生活,算法服务于生活---在力扣的成长(一)