「邏輯異或」進行數值轉換的過程分析

1、邏輯異或 spa

  運算符:code

  兩個操做數相同,結果爲 false( 0 )blog

  兩個操做數不一樣,結果爲 true( 1 )io

2、邏輯異或代碼操做實例與具體分析(正數與正數、正數與負數、負數與負數table

  • 案例 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  ( 原碼、補碼 )class

  變量 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 位tab

    正數補碼即爲原數值原碼。所以在如下解釋中除去部分零,不影響最終結果。di

  ( 1 )a = a ^ b ;co

( 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(正數與負數)
 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

未改變

 

 

 

 

  

 

 

 


  •   案例 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

未改變

相關文章
相關標籤/搜索