1,計算機中的存儲單位 bit和byte
- 計算機就是一系列的電路開關,每個開關存在兩種狀態開和關,如果電路是開着的它的值就是1,關就是0。
- 一個1或者0存儲爲一個bit(比特),它是計算機中最小的存儲單位。
- 計算機中最基本的存儲單元是byte(字節),每個字節由8個比特組成。
- 存儲單位的換算:
單位 換算
千字節 KB 1024B
兆字節 MB 1024KB
千兆字節 GB 1024MB
萬億字節 TB 1024GB
2,Java中的數據類型
- 基本數據類型
- 數值型
- 整數型
- byte 1個字節 表示範圍-128–127
- short 2個字節 表示範圍 -32768–32767
- int 4個字節 表示範圍 -2的31次方 – 2的31次方 (約21億)
- long 8個字節 -2的63次方 – 2的63次方
- 範圍小的轉爲範圍大的 ,精度不會丟失,範圍大的轉換爲範圍小的,,如果在數值在範圍小的類型的表示範圍內精度不會丟失,超過會造成精度丟失。
- 浮點型
- float 4個字節
- double 8個字節
- 整數型
- 字符型
- char 2個字節
- 布爾型
- boolean 1個字節
- 數值型
- 引用數據類型
- 類(Class)
- 數組(array)
- 接口(interface)
3,Java中的位運算
1,Java中的位運算
名稱 符號 運算結果
左移 << 空位補0,被移除的高位丟棄,空缺位補0。如果第一個1的高位沒有移出,左移一位相當於乘以2;
右移 >> 被移位的二進制最高位是0,右移後,空缺位補0,最高位是1,空缺位補1, 右移一位相當於除以2,如果最高位是0,右移一位相當於除以2;
無符號右移 >>> 被移位二進制最高位無論是0或者是1,空缺位都用0補;
按位或 | 二進制位進行|運算,只有0|0返回0,1其他都返回1,按位或後數值變大,與0或還是本身;
按位與 & 二進制位進行&運算,只有1&1時結果是1,否則是0;按位與後數值變小,與-1與後還是本身;
異或 ^ 相同位上的位相同則返回0,不同則返回1,結果變大或者變小;
取反 ~ 正數取反,各二進制碼按補碼各位取反,負數取反,各二進制碼按補碼各位取反,取反後的值爲其+1後取反,,即3按位取反後值爲-4;
2,在Java中將基本數據類型轉換爲byte[ ] 數組(字節數組),以int類型位例;
public static byte[] IntegerToByteArray4(Integer num){
byte[] bytes = new byte[4];
log.debug("需要轉換爲四字節數組的數字:{}, 此數字的16進製表示爲:{}", num, Integer.toHexString(num));
bytes[0] = (byte) (num >> 24);
bytes[1] = (byte) (num >> 16);
bytes[2] = (byte) (num >> 8);
bytes[3] = (byte) (num | 0x00);
return bytes;
}
public static byte[] getBytesX(int data) {
byte[] bytes = new byte[4];
bytes[0] = (byte) ((data & 0xff000000) >> 24);
bytes[1] = (byte) ((data & 0xff0000) >> 16);
bytes[2] = (byte) ((data & 0xff00) >> 8);
bytes[3] = (byte) (data & 0xff);
return bytes;
}
在上面demo中,,將int轉換爲byte[]數組的運算結果相同,,getBytesX工具類轉換時先將int數據和0xff000000進行與運算,最高的8位和0xff進行與運算後最高位其實沒有變化,,然後在右移24位,,將最高的8位封裝到byte[0]中,而IntegerToByteArray4工具類中沒有進行位運算,直接進行位移,兩個結果相同。
圖解(因爲圖放不下32個格,畫了20個代替,只看前8位,後面的道理相同)
0 1 1 1 0 0 0 1 1 0 0 1 0 0 1 0 0 1 1 1
1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
右移24位後的後前8位變成後8位,將後八位放的byte[0]的位置;