进制运算

进制运算

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,本质上还是减法(这里就不做赘述)

总结:计算机只会做加法

posted @ 2021-10-04 11:37  (x²+y²-1)³=x²y³  阅读(362)  评论(0编辑  收藏  举报