字節序,原碼和補碼與位運算
阿新 • • 發佈:2018-09-23
沒有 原碼 tools 大端 arr nta 內存地址 length 都是
計算機最小的數據獲取單元就是字節,一個字節byte = 8個位 bit,八個位是用二進制的形式保存的。假如11111111,如果是無符號數那麽可以保存0-255一共256(2的八次方)個數的數,如果是有符號那麽第一個位是符號位也就是 如果是1就是負數,如果是0就是正數。一共可以保持-128到127範圍的數字。
原碼和補碼,之所以出現這樣的概念就是為了計算機更好的計算。正數的原碼就是其補碼,而負數的補碼,首先把其正數的原碼符號位變成1 其余位按位取反 最後加 1。
字節序,分成大端序和小端序。對於一個字節的數據沒有順序的說法但是對於多個字節去表示一個數字比如int類型那就牽扯到在內存地址中的順序了。一般在計算機內存中都是小端序,也就是低字節(個十百中的個位叫地位)在內存的低地址,高字節在內存中的高地址。而大端序則相反,大端序通常用在網絡傳輸上。所以變成本地內存中的字節序通常需要一個轉序的操作。
最後就是位運算,這裏補上兩個函數,java中short 和 byte數組的轉換
1 package com.xunluyaoyao.tools; 2 3 public class ByteSortTools { 4 public static short[] byteToShort(byte[] source) { 5 if (source == null || source.length == 0) { 6 return null; 7 } 8 int times = source.length / 2;9 if (source.length % 2 != 0) { 10 times += 1; 11 } 12 short[] result = new short[times]; 13 for (int i = 0; i < source.length / 2; i++) { 14 short tmp = (short)(source[2 * i + 1] << 8 + source[2 * i]); 15 result[i] = tmp; 16 }17 if (times != source.length / 2) { 18 result[times] = (short)source[source.length - 1]; 19 } 20 return result; 21 } 22 public static void printArray(short[] source) { 23 if (source == null) { 24 return; 25 } 26 for (int i = 0; i < source.length; i++) { 27 System.out.println(source[i]); 28 } 29 } 30 31 public static void main(String[] args) { 32 byte[] bArray = new byte[]{0, 1, 0, 1}; 33 printArray(byteToShort(bArray)); 34 } 35 }
輸出結果 256 256
字節序,原碼和補碼與位運算