进制运算
进制运算
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,本质上还是减法(这里就不做赘述)
总结:计算机只会做加法
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!