天天看點

二進制的算法

    我們經常聽到十進制數和二進制數,在計算機中經常用二進制來計算,怎樣才能把我們常見的十進制數轉換為二進制數呢?

   這裡我們以十進制數68為例,8*10的0次方+6*10的一次方  

                                           45           5*10的0次方+4*10的一次方

                                          145          5*10的0次方+4*10的一次方+1*10的二次方

計算機中的2進制

01.原碼

02.反碼

03.補碼

1 byte=8 bit;

01.java中所有的數字都是有符号! 數字的最高位(最左邊的)就是符号位!

紅色标注的為高位 0代表正數  1代表負數

十進制的1   轉換為二進制就是   0 0 0 0 0 0 0 1

十進制的-1   轉換為二進制就是  1 0 0 0 0 0 0 1

02.正數的原碼,反碼,補碼都是一樣的!

03.負數的反碼=符号位不變+其他位取反

04.負數的補碼=反碼+1

反碼=補碼-1

05.計算機在運作的過程中 都是以 《補碼》 運算的!

1+1

  0 0 0 0 0 0 0 1

+     0 0 0 0 0 0 0 1

-------------------------    逢2進1

       0 0 0 0 0 0 1 0   結果為2    

-2+1

       1 0 0 0 0 0 1 0    ===》-2的原碼   需要轉換為反碼  

       1 1 1 1 1 1 0 1    ===》-2的反碼   需要轉換為補碼

  1 1 1 1 1 1 1 0    ===》-2的補碼   補碼才能參與運算

+     0 0 0 0 0 0 0 1    ===》 1的補碼    正數的 原碼 反碼 補碼 都一樣

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

       1 1 1 1 1 1 1 1    ===》 結果為補碼  需要轉換為反碼  再轉換為原碼

  1 1 1 1 1 1 1 0    ===》 結果為反碼

       1 0 0 0 0 0 0 1    ===》 原碼  結果為-1 

java中的位運算

01.& :按位與 兩位全為1,結果為1

2&3

運算過程:

   0 0 0 0 0 0 1 0 ==》2的補碼

& 0 0 0 0 0 0 1 1 ==》3的補碼

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

 0 0 0 0 0 0 1 0 ==》 結果2

02.| :按位或 兩位有一個為1,結果為1

2|3

運算過程:

  0 0 0 0 0 0 1 0 ==》2的補碼

| 0 0 0 0 0 0 1 1 ==》3的補碼

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

  0 0 0 0 0 0 1 1 ==》 結果3

03.~ :按位取反 :所有的0變成1,所有的1變成0 (僅限于一個表達式使用)

~3

0 0 0 0 0 0 1 1 ==》3的補碼

~

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

1 1 1 1 1 1 0 0 負數 這是原碼

1 0 0 0 0 0 1 1 反碼

1 0 0 0 0 1 0 0 補碼

~-5

1 0 0 0 0 1 0 1 ==》 -5的源碼

1 1 1 1 1 0 1 0 ==》 -5的反碼

1 1 1 1 1 0 1 1 ==》-5的補碼

~

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

0 0 0 0 0 1 0 0 ==》 4

04. ^ :按位異或 兩位一個是1一個是0,結果才是1

2^3

0 0 0 0 0 0 1 0

^ 0 0 0 0 0 0 1 1

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

0 0 0 0 0 0 0 1 ==>!

算術右移:符号位不變 ,低位溢出

10 >> 2

0 0 0 0 1 0 1 0

0 0 0 0 1 0 1 0

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

0 0 0 0 0 0 1 0

算術右移:符号位不變 ,低位補0

2 << 2

0 0 0 0 0 0 1 0

0 0 0 0 0 0 1 0

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

0 0 0 0 1 0 0 0 ==》2的三次方