二進制|什麼是反射?

二進制

2進制在哪裏?

計算機內部 只有 2進制數據!


int i = 50; System.out.println(i);//”50” Integer.toString(i)
Java編程語言, 編程語言利用算法支持10進制, 使用用戶感受上可以使用10進制!
編程語言: 人類與計算機溝通的橋樑!
顯示2進制數據
int i = 50;// Integer.parseInt(); System.out.println(Integer.toBinaryString(i));
Java 如何接收10進制數據: Integer.parseInt();
o將10進制字符串轉換爲2進制int
Java 如何輸出10進制數據: Integer.toString();
o將2進制int轉換爲10進制字符串
Scanner in = new Scanner(System.in); int n = in.nextInt();// 底層調用了 Integer.parseInt();
什麼是2進制
逢2進1的計數規則

16進制
16進制用於簡寫2進制
4位2進制可以簡寫爲一位16進制數字


經典面試題:
int i = 0x32; //0011 0010 System.out.println(i); 如上代碼輸出結果( ) 答案: 50 int i = 0xac; System.out.println(i); 如上代碼輸出結果( ) 答案:
補碼
計算機處理 有符號數(負數) 問題的算法.
補碼算法: 4位數補碼
規則:
1.總的位數是4位數
2.如果計算結果超過4位自動溢出捨棄


經典面試題目:
int n = 0xffffffff; System.out.println(n); 如上代碼輸出結果是:( ) A.2147483647 B.-2147483648 C.-2147483647 D.-1 答案: D 判斷對錯: 正數相加溢出結果是負數? 答案: 錯! System.out.println(~8+1); 輸出結果是( ) 答案: -8 System.out.println(~8); 輸出結果是( ) 答案: -9 System.out.println(~-8); 輸出結果是( ) 答案: 7
 2進制運算符
~ 取反(非) & 與運算 | 或運算 >>> 邏輯右移動運算 >> 數學右移動運算 << 左移動運算
& 與運算
0 & 0 = 0 0 & 1 = 0 1 & 0 = 0 1 & 1 = 1 n = 01001001 01110111 10101010 01010101 m = 00000000 00000000 00000000 00111111 &————————————— k = 00000000 00000000 00000000 00010101 int n = ‘中’; int m = 0x3f; int k = n&m; println(Integer.toBinaryString(n)); println(Integer.toBinaryString(m)); println(Integer.toBinaryString(k));
| 或運算(邏輯+)
0 | 0 = 0 0 | 1 = 1 1 | 0 = 1 1 | 1 = 1 n = 00000000 00000000 00000000 00101101 m = 00000000 00000000 00000000 10000000 | —————————————- k = 00000000 00000000 00000000 10101101 int n = 0x2d; int m = 0x80; int k = n | m; println(Integer.toBinaryString(n)); println(Integer.toBinaryString(m)); println(Integer.toBinaryString(k));

邏輯右移動運算
n = 00100010 01111010 10101010 10111011 m = n>>>1 000100010 01111010 10101010 1011101 k = n>>>2 0000100010 01111010 10101010 101110 int n = 0x227aaabb; int m = n>>>1; int k = n>>>2; int j = n>>>6; //按照2進制輸出

移位運算的數學意義


  • 移動小數點運算:
    1. 小數點向右移動 1242380. 小數點向右移動 1次, 數值*10 12423800. 小數點向右移動 2次, 數值*10*10 假設小數點位置不變 124238. 數字向左移動 1242380. 數字向左移動 1次, 數值*10 12423800. 數字向左移動 2次, 數值*10*10
      2進制數字移動, 與10進制數字移動規律相同: 2進制數值向左移動一次, 數值*2
      n = 00000000 00000000 00000000 00110010. = 50 n<<1 = 0000000 00000000 00000000 001100100. = 100 n<<2 = 000000 00000000 00000000 0011001000. = 200
      案例:
      int n = 50; int m = n<<1; println(m); //100

數學右移位計算:
1.相當於將原數據進行除法, 結果向小方向取整數.
2.>> 數學移位: 正數高位補0, 負數高位補1, 有數學意義
3.>>> 邏輯移位: 高位補0, 負時候沒有數學意義
案例:
n = 11111111 11111111 11111111 11110111 -9 n>>1 = 111111111 11111111 11111111 1111011 -5 n>>>1= 011111111 11111111 11111111 1111011 很大
案例:

一般情況下單純的將數字向右移動, 請使用 >>>
面試題:
優化 n*8 的計算爲 ( ) 答案: n<<3 優化 n*16 的計算爲 ( ) 答案: n<<4


練習題:
1.實現utf-8編碼算法:
public byte[] utf8(char ch){}
2.實現utf-8編碼算法:
public byte[] utf8(String ch){}
必須使用String的解碼算法建議編碼是否正確
反射

什麼是反射
反射是Java提供的動態執行機制, 可以動態加載類, 動態創建對象, 動態訪問屬性, 動態調用方法..
靜態執行: Java代碼經過編譯以後就確定的執行次序, 稱爲靜態執行次序
Foo foo = new Foo(); foo.test();
動態執行: 在運行期間才確定創建那個類的對象, 執行那個方法!
Java 反射API可以實現動態執行!
案例: 執行某個類中全部的以test爲開頭的方法. (必須使用使用反射實現)
反射:
1.反射是Java提供的API, 接受API的提供的功能!
2.是Java底層的執行機制.
反射功能
動態加載類
Class cls = Class.forName(類名)
作用: 將類名對應的類加載到方法區, 如果類名錯誤則拋出異常.
動態創建對象
Object obj = cls.newInstance();


特點:
動態創建對象
可以創建任何對象
cls對應的類必須有無參數構造器!!!
如果沒有無參數構造器則拋出異常!
反射API利用Constructer API支持有參數構造器, 略…
反射可以查詢類中的方法
可以返回類中聲明的全部方法信息
Method[] methods = cls.getDeclaredMethods(); for(Method m:methods){ System.out.println(m);//輸出方法信息 } Declared 聲明的 Method 方法
動態執行方法
執行方法:
1.必須有對象
2.找到對象對應的類型方法信息
o方法信息在類上查找
案例:
Method m = cls.getDeclaredMethod(方法名);//在類信息上查找一個方法信息 //m 代表 cls類上的一個方法信息 Object obj=cls.newInstance();//動態創建對象 //動態調用(invoke)方法 Object val = m.invoke(obj);


反射用途
1.Eclipse 的快捷菜單使用了反射, 利用反射發現了類的屬性和方法
2.Spring 利用了反射
o動態加載類
o動態創建Bean
o動態注入屬性, 包括私有屬性注入
o動態解析註解
3.MyBatis 利用了反射
o查詢時候, 動態了將查詢結果利於反射注入到Bean返回
4.JUnit 使用了反射
5.註解的解析使用了反射
6.Servlet調用使用了反射

發佈了63 篇原創文章 · 獲贊 24 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章