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


    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

    未改变

      

  • 相关阅读:
    使用arthas排查cpu飙高问题
    可转债发行一览表2022最新
    图解SSD不同的接口:SATA、MSATA、M.2 SATA、M.2 NVME
    eclipse maven 打war包的几种方式
    eclipse 在配置外部工具时可使用如下变量:
    LVS与Nginx区别
    maven
    mac下安装vuecli时报错error 13
    第一次使用Android Studio时你应该知道的一切配置
    window DOS命令官方介绍
  • 原文地址:https://www.cnblogs.com/debjJava/p/11890350.html
Copyright © 2020-2023  润新知