进制运算

进制运算

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 @   (x²+y²-1)³=x²y³  阅读(363)  评论(0编辑  收藏  举报
编辑推荐:
· 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 让容器管理更轻松!
点击右上角即可分享
微信分享提示