java中的二進制

二進制與進制轉換

二進制是計算技術中廣泛採用的一種數制。二進制數據是用0和1兩個數碼來表示的數。它的基數爲2,進位規則是“逢二進一”,借位規則是“借一當二”,由18世紀德國數理哲學大師萊布尼茲發現。當前的計算機系統使用的基本上是二進制系統,數據在計算機中主要是以補碼的形式存儲的。計算機中的二進制則是一個非常微小的開關,用“開”來表示1,“關”來表示0。在Java語言中byte代表最小計量單位,byte由8位2進制數組成。

二進制與編碼

      一般對英文字符而言,一個字節表示一個字符,但是對漢字而言,由於低位的編碼已經被使用(早期計算機並不支持中文,因此爲了擴展支持,唯一的辦法就是採用更多的字節數)只好向高位擴展。

      一般字符集編碼的範圍 utf-8>gbk>iso-8859-1(latin1)>ascllascll編碼是美國標準信息交換碼的英文縮寫,包含了常用的字符,如阿拉伯數字,英文字母和一些打印符號,請注意字符和數字的區別,比如'0'字符對應的十進制數字是48。

      unicode編碼包含很多種格式,utf-8是其中最常用的一種,utf-8名稱的來自於該編碼使用8位一個字節表示一個字符。對於一個漢字而言,它需要3個字節表示一個漢字,但大中華地區人民表示不服,搞一套gbk編碼格式,用兩個字節表示一個漢字。

 



二進制的轉換:

例如,設有一個二進制數:0110 0100(由後至前分別爲第0位,第1位……第7位),轉換爲10進製爲:

下面是豎式:

01100 100 換算成 十進制

第0位 0 x 2^0 = 0

第1位 0 x 2^1 = 0

第2位 1 x 2^2 = 4

第3位 0 x 2^3 = 0

第4位 0 x 2^4 = 0

第5位 1 x 2^5 = 32

第6位 1 x 2^6 = 64

第7位 0 x 2^7 = 0


(01100 100) =100

二進制位運算

優點:特定情況下,計算方便,速度快;由於多數電子設備都由二進制書寫的,所以支持面廣;較於算術方法,邏輯簡單。(機器默認32位)

按位與(&)

兩位全爲1結果才爲10&0=0;  0&1=0;   1&0=0;    1&1=1;
例如:51&5  即0011 0011 & 0000 0101 = 0000 0001 所以51&5=1.
用法:
(1)清零:如果想要一個單位清零,那麼使其全部二進制爲0,只要與一個各位都爲零的數值想與,結果爲零。

(2)取一個數中指定位:找一個數,對應X要取的位,該數的對應位爲1,其餘位爲零,此數與X進行“與運算”可以得到X中的指定位。
例如:設X=1010 1110,取X的低4位,用X & 0000 1111 = 0000 1110 就可以得到

按位或(|)

只要有一個爲1結果就爲1: 0|0=0;   0|1=1;   1|0=1;   1|1=1;
例如:51|5 即00110011 | 0000 0101 = 0011 0111 所以51|5 =55;
用法:常用來對一個數據的某些位置1;找到一個數,對應X要置1的位,該數的對應位爲1,其餘位爲零。此數與X相或可使X中的某些位置1。
例如:將X=1010 0000 的低四位置1,用X | 0000 1111 =1010 1111 就可以得到

異或運算(^)

兩個相應位爲“”(值不同),則該位結果爲1,否則爲0:  
0^0=0;  0^1=1;  1^0=1; 1^1=0;
例如:51^5 即 0011 0011 ^ 0000 0101 = 0011 0110 所以51^5=54;
用法:
(1)使特定位翻轉:找一個數,對應X要翻轉的各位,該數的對應位爲1,其餘位爲零,此數與X對應位異或就可以得到;
例如:X=1010 1110,使X低4位翻轉,用X ^ 0000 1111 = 1010 0001就可以得到

(2)與0相異或,保留原值
例如:X ^ 0000 0000 = 1010 1110 

(3)兩個變量交換值的方法:
1、藉助第三個變量來實現: C=A; A=B; B=C;
2、 利用加減法實現兩個變量的交換:A=A+B; B=A-B;A=A-B;

3、用位異或運算來實現:利用一個數異或本身等於0和異或運算符合交換律

例如:A=A^B;B=A^B;A=A^B;


取反運算(~)

對於一個二進制數按位取反,即將0變1,1變0: ~1=0;  ~0=1;

左移運算(<<)

將一個運算對象的各二進制位全部左移若干位(左邊的二進制丟棄,右邊補零
2<<1 = 4 :  10 <<1 =100=4
若左移時捨棄的高位不包括1,則每左移一位,相當於該數乘以2
例如:
11(1011) << 2 = 44  
11(0000 0000 0000 0000 0000 0000 1011)(32bit)   (在JAVA中整型是32位的,前面的0都省略了,所以1011中第一個“1”並不是高位,實際上是符合高位不包括1的條件)
-14(二進制:1111 0010)<< 2= (1100 1000)  (高位包括1,不符合規則)

右移運算(>>)

將一個數的各二進制位全部右移若干位,數左補0數左補1,右邊丟棄。操作數每右移一位,相當於該數除以2.

左補0 or 補1 得看被移數是正還是負。
例:1=4 >> 2
例:-14(1111 0010) >> 2 = -4 (1111  1100 )

無符號右移運算(>>>)

各個位向右移指定的位數。右移後左邊突出的位用零來填充。移出右邊的位被丟棄
例如:   -14>>>2   
          即-14(1111 1111 1111 1111 1111 1111 1111 0010)>>> 2
           =(0011 1111 1111 1111 1111 1111 1111 1100)
           =  1073741820


負數以其正值的補碼形式表示

原碼: 一個整數按照絕對值大小轉化成的二進制數爲原碼
           例如:14的原碼爲0000 0000 0000 0000 0000 0000 0000 1110

反碼:將二進制數按位取反,所得的新二進制數稱爲原二進制數的反碼。
           例如:14的反碼爲1111 1111 1111 1111 1111 1111 1111 0001

補碼:反碼加1稱爲補碼
           例如:1111 1111 1111 1111 1111 1111 11110001 +1 = 1111 1111 1111 1111 1111 1111 11110010


                  -14(1111 1111 1111 1111 1111 1111 1111 0010)<< 2
                   =(1111 1111 1111 1111 1111 1111 1100 1000
                   =?  (即爲-56)
  分析:
          只需要求出該補碼的原碼對應的正值,然後取相反數:
           1、補碼減一得到反碼:(...1100 0111)
           2、補碼取反得到原碼(即該負數的正值) (...0011 1000)
           3、計算正值  按照二-十進制轉換規則,正值爲56
           4、取相反數就會得到負數:-56

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

JDK內置的進制轉換

  
 十進制轉成十六進制Integer.toHexString(int i) 
 
  十進制轉成八進制                     Integer.toOctalString(int i)     
        十進制轉成二進制                    Integer.toBinaryString(int i)     
         十六進制轉成十進制            Integer.valueOf("FFFF",16).toString()     
         八進制轉成進制                Integer.valueOf("376",8).toString()     
           二進制轉成進制               Integer.valueOf("0101",2).toString()
 



Java中的進制

Java平時開發中“進制轉換”和“位操作”用的不多,Java處理的是高層;
在跨平臺中用的較多,如:文件讀寫,數據通信.

      1.直接按位做比例運算,一個short數字或char字符可有兩個byte數字表示,一個float或int數字可由4個byte數字表示,一個long或double數字可由8個byte數字表示。

      2.以2進制數表示範圍計算得到各整型數值表示範圍,每種數值類型的最大表示範圍可以通過包裝類的靜態屬性取到,比如Integer.MAX_VALUE。

      3.char類型是最具話題性的數據類型,它承擔着整個語言世界的符號統統轉換稱爲計算機所認識的編碼格式的重任,關於字符集和編碼包含了很多概念也帶來了很多問題。


Java中基本類型:

int數據類型:byte(8bit ,-128~127)        short(16 bit)       int(32 bit)   long(64 bit)

float數據類型: 單精度(32 bit  float)、雙精度(64 bit  double)

boolean類型:  true  false 

char數據類型:unicode字符(16位) 

對應的類類型:

Integer、Float、Boolean、Character、Double、Short、Byte、Long


數據類型轉化成字節:

8143(0000 0000 0000 0000 0001 1111 1100 1111)  => byte[] b =[-49,31,0,0]
第一個(低端)字節:8143>>0*8 & 0xff =(1100 1111)= 207(或有符號的-49)
第二個(低端)字節:8143>>1*8 & 0xff =(0001 1111)= 31
第三個(低端)字節:8143>>2*8 & 0xff =(0000 0000)= 0
第三個(低端)字節:8143>>2*8 & 0xff =(0000 0000)= 0


PS:
小端法(Little-Endian):低位字節排放在內存的低地址端即該值的起始地址,高位字節排放在內存的高地址端
大端發(Big-Endian):高位字節排放在內存的低地址端即該值的起始地址,低位字節排放在內存的高地址端

例如:
32bit寬的數0x12 34 56 78 
在Little-endian模式CPU內存中存放的存放方式(假設從地址0x4000開始存放)爲:

而在Big-endian模式CPU內存中的存放方式則爲:


字符串->字節數組
String s;  byte[] bs =s.getBytes();

字節數組->字符串
byte[] bs = new byte[int];
String s = new String(bs);或
String s = new String(bs,encode); //encode指編碼方式“gb2312,utf-8”





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章