/***@Title: ${filename}*@Package: ${package_name}*@Description: ${todo}*位運算符左移<< 右移>>與 &或 |異或 ^反碼 ~**@author: 源代碼資料盡在"清哥好課堂"公眾號:qghktit*@date: ${date}${time}*@version: 1.0*/public class BitwiseOp { public static void main(String[] args) { /* 反碼 ~ 以補碼進行運算 取反,符號位也要參與運算, 1-->0 0-->1 */ System.out.println(~5); /* 5補碼 0000-0000 0000-0000 0000-0000 0000-0101 ~5結果1111-1111 1111-1111 1111-1111 1111-1010 結果是一個負數(shù),補碼轉原碼 結果的原碼 1000-0000 0000-0000 0000-0000 0000-0110 結果:-6 */
System.out.println(~-5); /* -5的原碼:1000-0000 0000-0000 0000-0000 0000-0101 -5的補碼:1111-1111 1111-1111 1111-1111 1111-1011 ~-5結果: 0000-0000 0000-0000 0000-0000 0000-0100 結果 是一個正數(shù),補碼和原碼相同 結果 4 */ } public static void main5(String[] args) { /* 異或 ^ 相同為0,不同為1 1^1 = 0 0^0=0 1^0 = 1 0^1=1 以補碼參與運算 */ System.out.println(5^6); /* 5補碼 0000-0000 0000-0000 0000-0000 0000-0101 6補碼 0000-0000 0000-0000 0000-0000 0000-0110 結果:0000-0000 0000-0000 0000-0000 0000-0011 3 */ System.out.println(5^6^5); /* 5補碼 0000-0000 0000-0000 0000-0000 0000-0101 6補碼 0000-0000 0000-0000 0000-0000 0000-0110 結果:0000-0000 0000-0000 0000-0000 0000-0011 5補碼 0000-0000 0000-0000 0000-0000 0000-0101 結果 0000-0000 0000-0000 0000-0000 0000-0110 6 一個數(shù)與同一個數(shù)異或兩次,得到它自己 */ System.out.println(-5^6); /* -5的原碼:1000-0000 0000-0000 0000-0000 0000-0101 -5的補碼:1111-1111 1111-1111 1111-1111 1111-1011 6補碼 0000-0000 0000-0000 0000-0000 0000-0110 結果 1111-1111 1111-1111 1111-1111 1111-1101 是一個負數(shù),補碼轉原碼 結果的原碼 1000-0000 0000-0000 0000-0000 0000-0011 -3 */ System.out.println(-5^6^6); //-5
System.out.println(-5^-6); /* -5的原碼:1000-0000 0000-0000 0000-0000 0000-0101 -5的補碼:1111-1111 1111-1111 1111-1111 1111-1011 -6的原碼 1000-0000 0000-0000 0000-0000 0000-0110 -6的補碼: 1111-1111 1111-1111 1111-1111 1111-1010 -5^-6結果 0000-0000 0000-0000 0000-0000 0000-0001 結果 是正數(shù) 1 */ System.out.println(-5^-6^-6); //-5 System.out.println(-5^-6^-5); //-6 } public static void main4(String[] args) { /* 或 | 補碼進行運算 0|0=0 1|0=1 0|1=1 1|1=1 只要有1就是1 */ System.out.println(5|6); /* 5補碼 0000-0000 0000-0000 0000-0000 0000-0101 6補碼 0000-0000 0000-0000 0000-0000 0000-0110 結果: 0000-0000 0000-0000 0000-0000 0000-0111 7 */ System.out.println(-5|6); /* -5的原碼:1000-0000 0000-0000 0000-0000 0000-0101 -5的補碼:1111-1111 1111-1111 1111-1111 1111-1011 6補碼 0000-0000 0000-0000 0000-0000 0000-0110 -5|6的結果 1111-1111 1111-1111 1111-1111 1111-1111 結果是一個負數(shù),負數(shù)補碼轉原碼 結果的原碼 1000-0000 0000-0000 0000-0000 0000-0001 -1 */ System.out.println(-5|-6); /* -5的原碼:1000-0000 0000-0000 0000-0000 0000-0101 -5的補碼:1111-1111 1111-1111 1111-1111 1111-1011 -6的原碼 1000-0000 0000-0000 0000-0000 0000-0110 -6的補碼: 1111-1111 1111-1111 1111-1111 1111-1010 -5|-6結果:1111-1111 1111-1111 1111-1111 1111-1011 結果是一個負數(shù) 負數(shù)補碼轉原碼 結果的原碼 1000-0000 0000-0000 0000-0000 0000-0101 -5 */ } public static void main3(String[] args) { //與 & /* 補碼參與運算 1&1=1 1&0=0 0&1=0 0&0=0 只要有0就是0 */ System.out.println(5&6); //4 /* 5補碼 0000-0000 0000-0000 0000-0000 0000-0101 6補碼 0000-0000 0000-0000 0000-0000 0000-0110 結果 0000-0000 0000-0000 0000-0000 0000-0100 4 */ System.out.println(-5&6); //2 /* -5的原碼:1000-0000 0000-0000 0000-0000 0000-0101 -5的補碼:1111-1111 1111-1111 1111-1111 1111-1011 6補碼 0000-0000 0000-0000 0000-0000 0000-0110 -5&6的結果 0000-0000 0000-0000 0000-0000 0000-0010 結果為一個正數(shù), 補碼和原碼相同 轉十進制 2 */ System.out.println(-5&-6); /* -5的原碼:1000-0000 0000-0000 0000-0000 0000-0101 -5的補碼:1111-1111 1111-1111 1111-1111 1111-1011 -6的原碼 1000-0000 0000-0000 0000-0000 0000-0110 -6的補碼: 1111-1111 1111-1111 1111-1111 1111-1010 -5&6的結果 1111-1111 1111-1111 1111-1111 1111-1010 結果為一個負數(shù),負數(shù)的補碼轉原碼 結構的原碼 1000-0000 0000-0000 0000-0000 0000-0110 轉十進制 -6 */ } public static void main2(String[] args) { //右移>> 正數(shù)是每右移一位,除2 //右移運算,往右移,低位會被移出,高位上要補 //補,符號位上的數(shù),要是正數(shù)補0。要負數(shù),補1 System.out.println(5>>1); //2 5/2=2 /* 在補碼的基礎上進行 5 的補碼就是其原碼 0000-0000 0000-0000 0000-0000 0000-0101 5>>1之后的結果 0 0000-0000 0000-0000 0000-0000 0000-010 */ System.out.println(5>>2); // 1 5/2/2=1 System.out.println(5>>3); // 0 5/2/2/2=0
System.out.println(-5>>1); //-3 /* -5的原碼:1000-0000 0000-0000 0000-0000 0000-0101 -5的補碼:1111-1111 1111-1111 1111-1111 1111-1011 -5>>1的結果 1111-1111 1 111-1111 1 111-1111 1 111-1101 結果是一個補碼 轉成原碼 1000-0000 0000-0000 0000-0000 0000-0011 轉十進制 -3 */ System.out.println(-5>>2); //-2 System.out.println(-5>>3); //-1 System.out.println(-5>>4); //-1 System.out.println(-5>>5); //-1
} public static void main1(String[] args) { /* 數(shù) 用二進制來表示 用多少位來,機器字長來決定 機器字長32位, 4個8位,即4個字節(jié) 研究的是帶符號的數(shù),正數(shù),負數(shù) 符號位, 最高位,最左邊的位 0 表示正數(shù),1表示負數(shù) 符號位1 數(shù)據(jù)位31
在計算機當中,數(shù)的編碼格式,有四種 原碼 (反碼) 補碼 對于正數(shù)來說,原碼和補碼相同 對于負數(shù)來說,原碼的基礎上得到補碼, 在原碼的基礎上,除符號位以外,其它位分別取反, + 1,得到補碼 補碼-->原碼 在補碼的基礎上,除符號位以外,其它位分別取反后+1,得到原碼 */ //左移<< 正數(shù) 右邊空位(低位上補0) System.out.println(5<<1); //5左移一位,變成10 5*2 System.out.println(5<<2); //5左移兩位,變成20 5*2*2 //對于正數(shù),左移<< 每移一位,相于乘2 System.out.println(-5<<1); //-10 -5*2 /* -5的原碼:1000-0000 0000-0000 0000-0000 0000-0101 -5的補碼:1111-1111 1111-1111 1111-1111 1111-1011 -5<<1 高位移出, 低位補0 x結果: 1】111-1111 1111-1111 1111-1111 11111-0110 結果 是一個補碼 轉成原碼后才能轉成十進制 結果的原碼:1000-0000 0000-0000 0000-0000 0000-1010 -10 */ System.out.println(-5<<2); //-20 }}

清哥好課堂公眾號 微信號 : qghktit 新浪微博:清哥好課堂
|