1、邏輯異或 spa
運算符:^ code
兩個操做數相同,結果爲 false( 0 )blog
兩個操做數不一樣,結果爲 true( 1 )io
2、邏輯異或代碼操做實例與具體分析(正數與正數、正數與負數、負數與負數)table
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 未改變 |
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 未改變 |
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 未改變 |