Java中的&0xFF操作

DataOutputStream

  • 位於java.io.FilterOutputStream.DataOutputStream
  • 與機器無關地寫入各種類型的數據以及String對象的二進制形式,從高位開始寫
  • 任何機器上任何DataInputStream都能夠讀取這些寫入的數據
  • 所有的方法都以write開頭.比如writeByte(), writeFloat()

PrintStream

  • 位於java.io.FilterOutputStream.PrintStream
  • 最初的目的是爲了以可視化格式打印所有的基本數據類型以及String對象
  • 和DataOutputStream不同的是: PrintStream目的是將數據元素置入 “流” 中,使得DataInputStream能夠可移植地重構這些數據元素

二進制寫入

字符串寫成二進制

  • 字符串本質是char的序列,也就是char[]
  • 只要遍歷寫入每一個char, 就完成了寫一個字符串的功能

char寫成二進制

  • 英語字母有ASCII碼,可以將每個字符轉換成對應的數字
  • Unicode碼錶: 字符和編碼之間的映射,使用2個字節表示所有字符
    • Unicode字符編碼標準是固定長度的字符編碼方案,包含世界上幾乎所有現用語言的字符
  • Unicode根據要編碼的數據類型使用兩種編碼格式:
    • 16位:
      • 默認編碼格式爲16位.即每個字符是16位(2個字節寬度)
      • 通常顯示爲U+hhhh. 其中hhhh是字符的16進制代碼點
    • 8位
  • Unicode標準提供了一種擴展機制,允許編碼一百多萬個字符:
    • 使用一對高位和低位代用字符來對擴展字符或補充字符進行編碼
    • 第一個高位代用字符: 具有U+D800U+DBFF之間的值
    • 第二個低位代用字符: 具有U+DC00U+DFFF之間的值

writeChar源碼

  • 所以每一個char就是一個0-65535之間的數字
  • DataOutputStream.writeChar源碼:
public final void writeChar(String s) throws IOException {
	int len = s.length();

	for (int i = 0; i < len; i++) {
		int v = s.charAt(i);
		out.write((v >>> 8) & 0xFF);
		out.write((v >>> 0) & 0xFF);
	}
	incCount(len * 2);
}

writeShort源碼

  • writeChar相比 ,writeShort不需要遍歷一遍string
  • DataOutputStream.writeShort源碼:
public final void writeShort(int v) {
	out.write((v >>> 8) & 0xFF);
	out.write((v >>> 0) & 0xFF);
	incCount(2);
}

0xFF

  • 二進制寫入的問題:
    • 爲什麼要用無符號右移?
    • & 0xFF不會使得數的大小改變,爲什麼還要使用 & 0xFF ?
  • 0xFF是16進制的255,也就是二進制的1111
  • &是AND與操作,同時爲1才爲1,否則爲0

位移運算

  • 左移: <<. 右補0
  • 有符號右移: >>. 左補符號位
    • 如果符號位爲1則左補1
    • 如果符號位爲0則左補0
  • 無符號右移: >>>. 左補0

二進制寫入原理

  • 二進制寫入的方式: 先取高8位寫入,再寫入低8位
  • 示例: 寫入的short字符對應的unicode碼爲3
    • 先得到3的原碼的高8位:
      • 0000,0000,0000,0011 >>> 8得到0000,0000,0000,0000
      • 然後再 & 0xFF得到最終結果0000,0000
    • 再得到3的原碼的低8位:
      • 0000,0000,0000,0011 >>> 0得到0000,0000,0000,0011
      • 然後再 & 0xFF得到最終結果0000,0011

總結

  • & 0xFF就相當於計算機中的剪刀,當’&'操作符兩邊數的bit位數相同時不改變數的大小,只是轉麼截出一個字節8bit的長度
  • 同理 : & 0x0F可以得到4bit的長度
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章