進制運算
1. 有符號數與無符號數
無符號數規則
你這個數字是什么,那就是什么
1001 1010 十六進制:0x9A 十進制:154
有符號數規則
最高位是符號位:1(負數) 0(正數)
1001 1010 如何轉換?
2. 原碼反碼補碼
2.1 編碼規則
有符號數的編碼規則
原碼:最高位為符號位,對其他的位進行本身絕對值即可。
反碼:
- 正數:反碼和原碼相同
- 負數:符號位一定是1,其余位對原碼取反
測試
# 以8位進行舉例
# 如果是正數,那都是一樣的。
1
# 原碼:0000 0001
# 反碼:0000 0001
# 補碼:0000 0001
# 如果是負數
-1
# 原碼:1000 0001
# 反碼:1111 1110
# 補碼:1111 1111
-7
# 原碼:1000 0111
# 反碼:1111 1000
# 補碼:1111 1001
如果看到一個數字是二進制的,需要了解它是有符號數還是無符號數
3. 位運算
3.1 與運算(and)
兩個都為1,結果為1
1011 0001
1101 1000
--------- 與運算
1001 0000
3.2 或運算(or)
兩個只要有一個為1,結果就為1
1011 0001
1101 1000
--------- 或運算
1111 1001
3.3 非運算(not)
1變為0,0變為1
1101 1000
--------- 非運算
0010 0111
3.4 異或運算(xor)
相同為0,不同為1
1011 0001
1101 1000
--------- 異或運算
0110 1001
3.5 移位(左移1位乘2,右移1位除2)
0000 0001 1
0000 0010 2
0000 0100 4
0000 1000 8
3.5.1 左移(shl <<)
0000 0001 @ 所有二進制位全部左移若干位,高位就丟棄,低位就補0
0000 0010
3.5.2 右移(shr >>)
0000 0001 @ 所有二進制位全部右移若干位,低位就丟棄,高位就需要補0或1(由符號位決定)
0000 0000
4. 位運算實現加減乘除
4.1 加法
4+5=?
# 計算機是怎么操作的!
0000 0100
0000 0101
--------- 加法,計算機是不會直接加的
0000 1001
# 計算機的實現原理
# 第一步:異或,如果不考慮(沒有)進位,異或就可以求出結果
0000 0100
0000 0101
---------
0000 0001
# 第二步:與運算(判斷進位,如果運算結果為0,沒有進位)
0000 0100
0000 0101
---------
0000 0100
# 第三步:將與運算的結果左移一位
0000 0100
---------
0000 1000
# 第四步:異或(第一步的異或結果與第三步的左移結果進行異或)
0000 0001
0000 1000
---------
0000 1001
# 第五步:與運算(判斷進位,如果不考慮進位,直接求出結果)
0000 0001
0000 1000
---------
0000 0000
# 所以最終的結果就是與運算為0的結果的上一個異或運算
0000 1001
附上代碼(自己寫的,可能執行效率不高)
//計算機實現加減乘除——加法
public class Addition {
public static void main(String[] args) {
/*
* 計算4+5=?
* 0000 0100
* 0000 0101
* ---------
* 0000 1001 計算機是不會直接想加的
* 計算機的實現原理
* 第一步:異或,如果不考慮(沒有)進位,異或就可以直接出結果
* 0000 0100
* 0000 0101
* ---------
* 0000 0001
* 第二步:與運算(判斷進位,如果運算結果為0,沒有進位)
* 0000 0100
* 0000 0101
* ---------
* 0000 0100
* 第三步:將與運算的結果左移一位:0000 1000(進位后的結果)
* 第四步:異或
* 0000 0001
* 0000 1000
* ---------
* 0000 1001
* 第五步:與運算(判斷進位,如果運算結果為0,沒有進位)
* 0000 0001
* 0000 1000
* ---------
* 0000 0000
* 所以最終結果就是與運算為0的結果的上一個異或運算*/
int a=4;
int b=5;
int result;
int flag;
do{
result=a^b;
flag=a&b;
if(flag!=0){
a=result;
b=flag<<1;
}
}while(flag!=0);
System.out.println(result);
}
}
4.2 減法
4-5=?
# 計算機是怎么操作的!
4+(-5)
0000 0100
1111 1011 (計算機中存儲的是數的補碼)
---------
1111 1111
# 第一步:異或(如果不考慮進位,直接求出結果)
0000 0100
1111 1011
---------
1111 1111
# 第二步:與運算(判斷進位,如果與運算結果為0,沒有進位)
0000 0100
1111 1011
---------
0000 0000
# 最終結果就是:1111 1111
# 1111 1111
# 十六進制:ff
# 十進制:255或-1
# 所以需要判斷符號位
4.3 乘法
乘法:x*y,就是y個x相加,本質還是加法(這里就不做贅述)
4.4 除法
除法:x/y,就是x能減去多少個y,本質上還是減法(這里就不做贅述)
總結:計算機只會做加法