先看打印結果在看代碼比較好理解。結果在最下面的位置。
總結:講解了二進制的按位異域、按位與、左移的運算規則。並通過次3種算法得到2個數相加的結果。二進制應該還有其他算法,由於知識淺薄就不知道了。
代碼:
public static void main(String[] args){ int a=11,b=9;//初始化要執行加法的值 System.out.println("===開始二進制運算==="); add(a,b); System.out.println("===二進制運算結束==="); } /** * 將二進制的數據打印出來 * @param binars 需要打印的二進制值 * @param paramName 需要打印的參數名稱 * @return 返回打印的字符串 */ public static String printBnary(StringBuilder binars,int param){ StringBuilder binarsRe=new StringBuilder(); String[] strs=binars.toString().split(","); int strLength=strs.length; while (strLength>=1){ binarsRe.append(strs[strLength-1]+" "); strLength--; } return binarsRe.toString(); } /** * 十進制轉換為二進制輸出 * @param a 要轉換的十進制數 * @param binars 接收轉換后的二進制數據 * @param paramName 需要打印的參數名稱 * @return */ public static String DecimalTransBinary(int a,StringBuilder binars,int param){ int rem=a%2;//取余數 int base=a/2;//取基數 /** * 物流是余數和基數都必須除盡為0 */ if(base>0 || rem>0){ //將所有的余數都添加到字符串中使用,隔開在打印是使用 binars.append(rem+","); DecimalTransBinary(base,binars,param); } //十進制轉換二進制成功后,將二進制數據打印出來 return printBnary(binars,param); } /** * 十進制加法,解釋如何使用二進制實現的 * @param a 執行加法的參數 * @param b 執行加法的參數 * @return 返回加法成功后的整數 */ public static int add(int a,int b){ //對需要相加的數據輸出為二進制 StringBuilder binars=new StringBuilder(); String aStr=DecimalTransBinary(a,binars,a); //將stringBuilder數據輸出到控制台 binars.setLength(0); String bStr=DecimalTransBinary(b,binars,b); int res=a; //按為異域的二進制運算 int xor=a^b; System.out.println(""); System.out.println("按位異域(^):二進制數據的相同位不同則為1,相同則為0。"); System.out.println(a+"的二進制值:"+aStr); System.out.println(b+"的二進制值:"+bStr); System.out.println("參數:"+a+" 參數:"+b+" 進行"+a+"^"+b+":"); binars.setLength(0); String xorStr=DecimalTransBinary(xor,binars,xor); System.out.println(aStr+"^"+bStr+"="+xorStr); System.out.println("按位異域后得到的二進制值:"+xorStr); System.out.println("按位異域后得到的十進制值:"+xor); //按位與的二進制運算和左移一位的值 int forward=(a&b)<<1; System.out.println(); System.out.println("按位與(&):二進制數據的相同位都為1則為1,若有一個不為1則為0。"); System.out.println("左移(<<):二進制數據左移b為(在后面添加b個0)。例如:11<<1。11的二進制為1011,左移1為就是10110;"); System.out.println("10110轉換為十進制就是:22。左移用十進制解釋就是,11乘以2的1次方的結果。11<<2就是11乘以2的次方的結果。"); System.out.println("參數:"+a+" 參數:"+b+" 進行("+a+"&"+b+")<<1:"); binars.setLength(0); String forwardStr=DecimalTransBinary(forward,binars,forward); System.out.println("("+aStr+"&"+bStr+")<<1="+forwardStr); System.out.println("按位與后得到的二進制值:"+forwardStr); System.out.println("按位與后得到的十進制值:"+forward); System.out.println(); if(forward!=0){ System.out.print("("+a+"&"+b+")<<1="+forward+"運算結果不為0,"); System.out.println("將"+a+"^"+b+"運算的結果值:"+xor+";("+a+"&"+b+")<<1運算的結果值:"+forward+"。繼續重復以上運算。"); res=add(xor,forward); }else{ System.out.println("("+a+"&"+b+")<<1="+forward+"運算結果為0;"+a+"^"+b+"按位異域的運算結果就是最終的和:"+xor); res=xor; } return res; }
結果:
===開始二進制運算===
按位異域(^):二進制數據的相同位不同則為1,相同則為0。
11的二進制值:1 0 1 1
9的二進制值:1 0 0 1
參數:11 參數:9 進行11^9:
1 0 1 1 ^1 0 0 1 =1 0
按位異域后得到的二進制值:1 0
按位異域后得到的十進制值:2
按位與(&):二進制數據的相同位都為1則為1,若有一個不為1則為0。
左移(<<):二進制數據左移b為(在后面添加b個0)。例如:11<<1。11的二進制為1011,左移1為就是10110;
10110轉換為十進制就是:22。左移用十進制解釋就是,11乘以2的1次方的結果。11<<2就是11乘以2的次方的結果。
參數:11 參數:9 進行(11&9)<<1:
(1 0 1 1 &1 0 0 1 )<<1=1 0 0 1 0
按位與后得到的二進制值:1 0 0 1 0
按位與后得到的十進制值:18
(11&9)<<1=18運算結果不為0,將11^9運算的結果值:2;(11&9)<<1運算的結果值:18。繼續重復以上運算。
按位異域(^):二進制數據的相同位不同則為1,相同則為0。
2的二進制值:1 0
18的二進制值:1 0 0 1 0
參數:2 參數:18 進行2^18:
1 0 ^1 0 0 1 0 =1 0 0 0 0
按位異域后得到的二進制值:1 0 0 0 0
按位異域后得到的十進制值:16
按位與(&):二進制數據的相同位都為1則為1,若有一個不為1則為0。
左移(<<):二進制數據左移b為(在后面添加b個0)。例如:11<<1。11的二進制為1011,左移1為就是10110;
10110轉換為十進制就是:22。左移用十進制解釋就是,11乘以2的1次方的結果。11<<2就是11乘以2的次方的結果。
參數:2 參數:18 進行(2&18)<<1:
(1 0 &1 0 0 1 0 )<<1=1 0 0
按位與后得到的二進制值:1 0 0
按位與后得到的十進制值:4
(2&18)<<1=4運算結果不為0,將2^18運算的結果值:16;(2&18)<<1運算的結果值:4。繼續重復以上運算。
按位異域(^):二進制數據的相同位不同則為1,相同則為0。
16的二進制值:1 0 0 0 0
4的二進制值:1 0 0
參數:16 參數:4 進行16^4:
1 0 0 0 0 ^1 0 0 =1 0 1 0 0
按位異域后得到的二進制值:1 0 1 0 0
按位異域后得到的十進制值:20
按位與(&):二進制數據的相同位都為1則為1,若有一個不為1則為0。
左移(<<):二進制數據左移b為(在后面添加b個0)。例如:11<<1。11的二進制為1011,左移1為就是10110;
10110轉換為十進制就是:22。左移用十進制解釋就是,11乘以2的1次方的結果。11<<2就是11乘以2的次方的結果。
參數:16 參數:4 進行(16&4)<<1:
(1 0 0 0 0 &1 0 0 )<<1=
按位與后得到的二進制值:
按位與后得到的十進制值:0
(16&4)<<1=0運算結果為0;16^4按位異域的運算結果就是最終的和:20
===二進制運算結束===