本篇解释算法第一道题,原题在我的gitee中
https://gitee.com/xiao-baihao/algorithm-brushing/tree/master
有符号和无符号的区别
进制的转换
- 二进制转十进制
二进制转十进制:从最低位开始(右边低一位) 将每个位置上的数提出来,乘以2的(位数 -1)次方,然后把数加起来
一个字节有8位
0b0001011
1 * 2(1 - 1) + 1 * 2(2 - 1) + 0 * 2(3 - 1) + 1 * 2(4 - 1) = 11
- 八进制转十进制
八进制转十进制:从低位开始 将每个位置上的数提出来,乘以8的(位置 -1)次方,然后把数加起来
00000234
4 * 8(1 - 1) + 3 * 8(2 - 1) + 2 * 8(3 - 1) = 28 + 128 = 156
- 十六进制转十进制
十六进制转十进制:从低位开始 将每个位置上的数提出来,乘以16的(位置 -1)次方,然后把数加起来
十六进制有1-9 A-F (A-F代表 10—16)
0x代表的是16进制它是一个标识符
0x0000023A
10 * 16(1 - 1) + 3 * 16(2 -1) + 2 * 16(3 -1) = 570
- 十进制转二进制
34
00100010
有一个凑数的方法:想好2的几次方是多少,
比如说2^1(10)是2, 2^2(100)是4, 2^3(1000)是8, 2^4(10000)是16, 2^5是32,
2^6是64, 2^7是128, 2^8是256, 2^9是512, 2^10 1024
这样凑数的方法就可以得出 2^5 + 2^1 = 100000 + 10 = 100010
可以利用这个方法算一个大的数2012
可以拆成2^3 + 2^2 + 2^10 + 2^9 + 2^8 + 2^7 + 2^6 + 2^4= 4 + 8 + 1024 + 512 + 256 + 128 896 - 976 = 80
10000000000
1000000000
100000000
10000000
1000000
10000
1000
100
11111011100
- 十进制转成八进制
先转成二进制在转八进制
131 = 2^7 + 2^1 + 1 = 10000011
(10)(000)(011) = 203
- 二进制转八进制
2进制转八进制: 从低位开始将二进制每三位为一组,转成对应的八进制数即可,从后往前
10000011
(10)(000)(011) = 203
- 十进制转十六进制
十进制转成16进制
先转2进制在转16进制
131 = 2^7 + 2^1 + 1 = 10000011
- 二进制转十六进制
2进制转16进制:从低位开始将二进制每四位为一组,转成对应的16进制即可,从后往前
10000011
(1000)(0011) = 83
- 八进制转二进制
8进制转2进制,可以先转10进制然后在转2进制,16进制也一样
java中运算符
原码 补码 反码
位运算
>>、>>>、<<
1. 算术右移>>: 低位溢出,符号位不变,并用符号位补溢出的高位
2. 算数左移<<: 符号位不变,低位补零
3. >>> 逻辑右移也叫无符号右移,运算规则是:低位溢出,高位补0
没有 <<< 符号
案列:1. int a = 1 >> 2; 1 / 2 / 2
2. int b = 1 << 2; 1 * 2 * 2;
右移就是除以2,左移就是乘以2
例子
例子: 2&3、~-2、~2、2|3、^3
一、 2&3 首先要把十进制的数转换成原码也就是32为的2进制,一个字节是8位,一共有4个字节,然后在转成补码
2的原码 = 0000000000000000000000000000000010
2的补码 = 0000000000000000000000000000000010
3的原码 = 0000000000000000000000000000000011
3的补码 = 0000000000000000000000000000000011
(0000000000000000000000000000000010) & (0000000000000000000000000000000011)
结果:0000000000000000000000000000000010 = 2
二、~-2
-2的原码 = 1000000000000000000000000000000010
-2的反码 = 1111111111111111111111111111111101
-2的补码 = 1111111111111111111111111111111110
~-2 = 0000000000000000000000000000000001
结果:0000000000000000000000000000000001 = 1
三、~2
2的原码:0000000000000000000000000000000010
2的补码:0000000000000000000000000000000010
~2补码:1111111111111111111111111111111101
拿到反码:1111111111111111111111111111111100
拿到原码:1000000000000000000000000000000011
结果:1000000000000000000000000000000011 = 3