快速十进制与二进制的互转
正数十进制转二进制
- 首先记住一个大概长度的次幂表:
2^7 | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 |
---|---|---|---|---|---|---|---|
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
2. 然后将需要换算的数值进行拆分
3. 最后在对应数字上标志1,没有的标记0,有点抽象,实例一下子就懂了
例子:5 转 二进制
- 5 = 2^0 + 2^2
- 即 2^0 和 2^2 下方为 1 其余为 0
- 则以8位的表示则为:00000101
2^7 | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 |
---|---|---|---|---|---|---|---|
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 |
反推二进制就返回来就是了:
次幂下方是1的 直接相加:2^2 + 2^0 = 5
负数的二进制转换:
- 换算成源码,源码就是数值绝对值的二进制
- 反码,源码取反,也就是0变1,1变0
- 补码,即低位+1得到负数二进制
例子:-5 转 二进制
- 源码:00000101
- 反码:11111010
- 补码:11111011
所以 -5 的二进制就为 11111011
小数的二进制转换:
十进制的小数转换为二进制,主要是小数部分乘以2,取整数部分依次从左往右放在小数点后,直至小数点后为0。注意:会存在一直小数点后不为0.
例如:十进制的0.125,要转换为二进制的小数。
- 小数部分0.125乘以2,得0.25,然后取整数部分0。
- 再将小数部分0.25乘以2,得0.5,然后取整数部分0。
- 再将小数部分0.5乘以2,得1,然后取整数部分1。
- 则得到的二进制的结果就是0.001。
异或运算 ^
相同的为0,不同的为1,满足交换律 a ^ b ^ c = c ^ a ^ b,可以用来两个数交换 a ^ b ^ a = b,a ^ b ^ b = a
int a =5,b = 6;
//5二进制:0101
//6二进制:0110
int a ^ b = 3; // 3二进制为:0011
//例子:再不申请新的存储空间的前提实现两个数交换,根据 a ^ b ^ a = b 实现
int num1 = 4,num2 = 5;
num1 = num1 ^ num2;// 4^5
mum2 = num1 ^ num2;//4^5^5 = 4
num1 = num1 ^ num2;//4^5^4 = 5