標籤:als body mic one turn 支援 正確答案 color 為什麼
主要內容
1.十進位二進位互轉
2.二進位的位元運算
3.JDK內建的進位轉換
4.JAVA中的進位
十進位二進位互轉
57 111001
二進位的位元運算:優點:特定情況下,計算方便,被支援面廣泛。① 按位與& (兩位全位1,結果才為1)0與0=0;0與1=0;1與0=0; 1與1=1;例:51與500110011---------------00000101=00000001=1位元運算的特殊用法:*清零,取一個數中的指定位 ②按位或 | (只要有一個位位1,結果就為1)0|0=0; 0|1=1; 1|0=1; 1|1=1;例:51|5 =00110011---------------00000101=00110111 = 55或運算的特殊用法:常用來對一個資料的某些位置1; ③異或運算 ∧ (兩個相應位為“異”,則該結果為1,否則為0)0∧ 0=0; 0∧ 1=1; 1∧ 0=1; 1∧ 1=0;例:51∧ 5=00110011---------------00000101=00110110=54特殊用法:*使特定位翻轉*與0異或保留原值*取反運算(對一個位元按位取反,即將0變為1,1變為0) 利用與0異或,兩個變數交換值的方法:兩個變數交換值的方法有:1.藉助第三個變數C=A; A=B; B=C;2.利用加減法C=A+B; B=C-B; A=C-B;3.用位異或運算實現 (效率最高)A=A∧B; B =A∧B; A=A∧B; 左移運算<< (將一個運算對象的各二進位位全部左移若干位,左邊的二進位位丟棄,右邊補0)2<<1= 4 右移運算>>(將一個運算對象的各二進位位全部右移若干位,正數左補0,負數左補1,右邊丟棄) 無符號右移 負數以其正值的補碼形式表示 原碼:一個正數按照絕對值大小轉換成的二進位稱為原碼。 反碼 補碼:反碼加1稱為補碼 JDK內建的進位轉換:
JAVA中的進位:平時開發,進位轉換和位操作用的並不多,因為JAVA處理的是高層在跨平台中用的較多,檔案讀寫,資料通訊等。 基礎資料型別 (Elementary Data Type):int資料類: 1位元組= 8bitbyte(8bit,-128~127)short(16bit)int(32bit)long(64bit)float:單精確度32bit ,雙精確度64bitbolean:true 1bit,false 1bitchar:unicode字元 16位對應的封裝類:Integer...... 在JAVA裡面除去基礎資料型別 (Elementary Data Type)的其它類型都是引用資料類型,String是一個類,所以String不是基本類型而是參考型別。
資料類型轉換為位元組:int (8143)8143(00000000,00000000,00011111,11001111)=byte[]={-49,31,0,0}第一個位元組(低端) 8143>>0*8&0xff=(11001111)=207或有符號-49第二個位元組(低端) 8143>>1*8&0xff=(00001111)=31第三個位元組(低端) 8143>>2*8&0xff=(00000000)=0第四個位元組(低端) 8143>>3*8&0xff=(00000000)=0 byte轉int的時候為什麼非要先&0xff計算出來才是正確答案?首先,JAVA中的二進位採用的是補碼形式,並非原碼或反碼,這3個概念要搞清楚;其次,byte佔8位,int佔32位,將byte強制轉換為int型時,如果沒有做 & 0xff運算,且byte對應的值為負數的話,就會對高位3個位元組進行補位,這樣就有可能出現補位誤差的錯誤。舉例來說,byte型的-1,其二進位(補碼)為11111111(即0xff),轉換成int型,值也應該為-1,但經過補位後,得到的二進位為11111111111111111111111111111111(即0xffffffff),這就不是-1了,對吧?而0xff預設是int型,所以,一個byte跟0xff相與,會先將那個byte轉化成int型運算,這樣,結果中的高位3個位元組就總會被清0,於是結果就是我們想要的了~ 字串轉化為位元組資料 :String s; byte[] bs = s.getBytes();位元組數組轉化為字串:String s = new Stirng(bs);String s = new String(bs,encode);//encode指編碼方式 "gb2312,utf-8"
1 public class Convert { 2 3 /** 4 * <<左移運算<<右移運算<<<無符號右移 5 */ 6 7 // int轉Byte[] 8 public static byte[] int2Bytes(int id) { 9 byte[] arr = new byte[4];10 arr[0] = (byte) ((int) (id >> 0 * 8) & 0xff);11 arr[1] = (byte) ((int) (id >> 1 * 8) & 0xff);12 arr[2] = (byte) ((int) (id >> 2 * 8) & 0xff);13 arr[3] = (byte) ((int) (id >> 3 * 8) & 0xff);14 return arr;15 }16 17 // Byte[]轉int18 public static int Bytes2int(byte[] arr) {19 int rs0 = (int) ((arr[0] & 0xff) << 0 * 8);20 int rs1 = (int) ((arr[1] & 0xff) << 1 * 8);21 int rs2 = (int) ((arr[2] & 0xff) << 2 * 8);22 int rs3 = (int) ((arr[3] & 0xff) << 3 * 8);23 return rs0 + rs1 + rs2 + rs3;24 }25 26 // long轉化為byte[]27 public static byte[] long4Bytes(long id) {28 byte[] arr = new byte[8];29 for (int i = 0; i < arr.length; i++) {30 arr[i] = (byte) ((int) (id >> i * 8) & 0xff);31 }32 return arr;33 }34 35 /**36 * byte[]轉化為long型和轉化int型一樣,只是long是64bit,而int是32bit37 */38 public static void main(String[] args) {39 byte[] arr = Convert.int2Bytes(8143);40 System.out.println(arr[0] + "\n" + arr[1] + "\n" + arr[2] + "\n" + arr[3]);41 int rs = Convert.Bytes2int(arr);42 System.out.println(rs);43 44 byte[] arr2 = Convert.long4Bytes(20);45 for (byte b : arr2) {46 System.out.println(b);47 }48 49 // 字串與位元組數組:50 String describle = "我是字串";51 byte[] barr = describle.getBytes();52 String des = new String(barr);53 System.out.println(des);54 }55 56 }View Code
JAVA 二進位基礎