进制运算
进制运算
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,本质上还是减法(这里就不做赘述)
总结:计算机只会做加法
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!