天天看點

Java中的二進制基礎 二進制與進制轉換 二進制位運算 JDK内置的進制轉換 Java中的進制

二進制與進制轉換

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

二進制的轉換:

例如,設有一個二進制數: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,結果才為1: 0&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内置的進制轉換

Java内置的進制轉換:

         十進制轉成十六進制                       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]  view plain  copy

  1. public static void main(String[] args) {  
  2.         //十進制轉換成其他進制  
  3.         System.out.println("十進制轉換成二進制:"+Integer.toBinaryString(112));  
  4.         System.out.println("十進制轉換成十六進制:"+Integer.toHexString(112));  
  5.         System.out.println("十進制轉換成八進制:"+Integer.toOctalString(112));  
  6.         System.out.println("");    
  7.         //其他進制轉換成十進制  
  8.         System.out.println("二進制轉換成十進制:"+Integer.parseInt("111001", 2));  
  9.         System.out.println("八進制轉換成十進制:"+Integer.parseInt("27", 8));  
  10.         System.out.println("十六進制轉換成十進制:"+Integer.parseInt("A8", 16));  
  11.         System.out.println("");   
  12.         System.out.println("二進制轉換成十進制:"+Integer.valueOf("111001",2).toString());  
  13.         System.out.println("八進制轉換成十進制:"+Integer.valueOf("27",8).toString());  
  14.         System.out.println("十六進制轉換成十進制:"+Integer.valueOf("A8",16).toString());  
  15.     }  

Java中的進制

Java平時開發中“進制轉換”和“位操作”用的不多,Java處理的是高層; 在跨平台中用的較多,如:檔案讀寫,資料通信.

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開始存放)為:

Java中的二進制基礎 二進制與進制轉換 二進制位運算 JDK内置的進制轉換 Java中的進制

而在Big-endian模式CPU記憶體中的存放方式則為:

Java中的二進制基礎 二進制與進制轉換 二進制位運算 JDK内置的進制轉換 Java中的進制

字元串->位元組數組 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”

參考資料: http://baike.baidu.com/view/18536.htm http://www.cnblogs.com/lds85930/archive/2007/09/19/897912.html

http://www.imooc.com/learn/195