欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-22 19:38:26
1、逻辑异或 运算符:^ 两个操作数相同,结果为 false( 0 ) 两个操作数不同,结果为 true( 1 ) 2、逻辑异或代码操作实例与具体分析(正数与正数、正数与负数、负数与负数) 2.1 案例(正数与正数) 1 int a = 2; 2 int b = 7; 3 4 System.out. ......

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

未改变