我們經常聽到十進制數和二進制數,在計算機中經常用二進制來計算,怎樣才能把我們常見的十進制數轉換為二進制數呢?
這裡我們以十進制數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的三次方