進制運算


進制運算

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,本質上還是減法(這里就不做贅述)

總結:計算機只會做加法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM