fb-script

2015年9月1日 星期二

JAVA 中 char, byte, bit

char 轉 byte
在 JAVA 中一個 char是 16 bits, 一個 byte 是 8 bits, 一個 bit 就是一個 0 或者 1
一個 char 可以看成是:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
一個 byte 可以看成是:0 0 0 0 0 0 0 0

16 進位表示法 0 ~ F =10 進位的 0 ~ 15 = 2 進位的 0 ~ 1111,所以每四個 bit 就可以用一個 16 進位的符號來表示,也習慣上把四個 bit 連在一起寫。
所以一個 byte 可以表示的範圍就是由 0000 0000 到 1111 1111,以 16 進位表示就是 00 到 FF,以 10 進位表示就是 0 到 255 囉!也就是總共 256 個數。
而一個 char 可以表示的範圍就是由 0000 0000 0000 0000  到 1111 1111 1111 1111,以 16 進位表示為 0000 到 FFFF,而以 10 進位表示就是 0 到 65535,總共 65536 個數。
所以一個 char 是沒辦法轉成一個 byte 的,因為 char 比 byte 大。但是可以將一個 char 轉成 “兩個” byte
那這邊就介紹怎麼把這兩個 byte 從一個 char 抓出來囉!

首先假設一個 char 是:1011 1101 0000 0001
第一個 byte 就是:1011 1101
第二個 byte 就是:0000 0001
取出第一個 byte : 將 char 做右移的位移運算 8 個 bit

過程
1011 1101 0000 0001 向右移 8 個 bit 就會變成
---- ---- 1011 1101
因為一個 char 是 16 個 bit,右移後其他的位置就變成 0 了,所以正確的表示應該是 0000 0000 1011 1101
這時候再把這個 char 強制轉成 byte,就可以拿到 1011 1101
具體的程式碼為
char c = 0b0001001000000011;
byte firstByte = (byte)(c >> 8);
System.out.println(firstByte); // 會顯示 18

這時候 firstByte 是 0b00010010,計算一下就可以知道是 18 沒錯啦,以 16 進位表示為 0x12

取出第二個 byte :將 char 和 0000 0000 1111 1111 做交集(and)運算
過程
0001 0010 0000 0011
0000 0000 1111 1111
------------------- (&
0000 0000 0000 0011
最後得到的就可以和第一個 byte 一樣將 char 強制轉型成 byte 獲得,具體的程式碼為
byte secondByte = (byte)(c & 0x00FF);
System.out.println(secondByte); // 會顯示3

計算 secondByte 是 0b00000011,看一下就知道是 10 進位的 3 啦!

完整程式

public static void main(String[] args) {
    char c = 0b0001001000000011;
    byte firstByte = (byte) (c >> 8);
    System.out.println(firstByte);
    byte secondByte = (byte) (c & 0x00FF);
    System.out.println(secondByte);
}
  • JAVA 中 0x 開頭表示使用 16 進位表示法,0b 開頭表示 2 進位表示法
  • JAVA 中 byte 是有號數,範圍是 10 進位的 -128 ~ 127,包含 0 總共 256 個數,這也就是為什麼在 JAVA 中如果宣告一個 byte 為 128,會產生編譯時期錯誤,如果強制轉型為 byte 就會變成 -128,因為產生了溢位
  • JAVA 中 char 屬於字元,不屬於整數的部分,所以不會轉成有號數
  • JAVA 中 and 運算子為 &,運算法則為同為 1 時則為 1,其他情況皆為 0

沒有留言:

張貼留言