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

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