本篇解释算法第一道题,原题在我的gitee中
https://gitee.com/xiao-baihao/algorithm-brushing/tree/master

有符号和无符号的区别

进制的转换

  1. 二进制转十进制
二进制转十进制:从最低位开始(右边低一位) 将每个位置上的数提出来,乘以2的(位数 -1)次方,然后把数加起来
一个字节有8位
0b0001011
1 * 2(1 - 1) + 1 * 2(2 - 1) + 0 * 2(3 - 1) + 1 * 2(4 - 1) = 11
  1. 八进制转十进制
八进制转十进制:从低位开始 将每个位置上的数提出来,乘以8的(位置 -1)次方,然后把数加起来
00000234
4 * 8(1 - 1) + 3 * 8(2 - 1) + 2 * 8(3 - 1) = 28 + 128 = 156
  1. 十六进制转十进制
十六进制转十进制:从低位开始 将每个位置上的数提出来,乘以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
  1. 十进制转二进制
 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
  1. 十进制转成八进制
先转成二进制在转八进制
131 = 2^7 + 2^1 + 1 = 10000011
(10)(000)(011) = 203
  1. 二进制转八进制
2进制转八进制: 从低位开始将二进制每三位为一组,转成对应的八进制数即可,从后往前
10000011
(10)(000)(011) = 203
  1. 十进制转十六进制
十进制转成16进制
先转2进制在转16进制
131 = 2^7 + 2^1 + 1 = 10000011
  1. 二进制转十六进制
2进制转16进制:从低位开始将二进制每四位为一组,转成对应的16进制即可,从后往前
10000011
(1000)(0011) = 83
  1. 八进制转二进制
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
12-09 13:57