进制捞位移

一)茅塞顿开的东东哦:

int类型占4个字节(byte);
一个字节=8bit(位);
一个int类型的数值占32bit(位)
int i = 123;
10进制123转为二进制后等于:1111011
完整补位后:00000000 00000000 00000000 01111011
1024字节 = 1KB

二)二进制以及十进制之间的相互转换:

  java方法:Integer.toBinaryString(int); // 十进制转化为二进制

      Integer.parseInt("10110000000001001001011101001",2); // 多少进制转换为十进制。第一个参数为二进制字符串,第二个参数为这个字符串是多少进制的

  1111011: 1*2^6 + 1*2^5 + 1*2^4 + 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = 123

  123:取余再倒上

三)字节以及位以及范围,终于弄懂了好高兴

  注意这里的数列规律:2^0+2^1+2^2+2^3+2^4+2^5+2^6 = 2^7-1

  1字节为8位,所以1字节的范围为:[-127,127]

    1111 1111 = -(2^0+2^1+2^2+2^3+2^4+2^5+2^6) = -(2^7-1) =  -127

    0111 1111 = 2^0+2^1+2^2+2^3+2^4+2^5+2^6 = 2^7-1 = 127

        所以byte,short,int,long的长度分别为:2^0、2^1、2^2、2^3字节,8*2^0、8*2^1、8*2^2、8*2^3 位

四)位与运算,位或运算,异或运算

  &:只有对应的两个二进制数为1时,结果位才为1

  |: 有一个为1的时候,结果位就为1

  ^:同则取0,异则取1

  0 & 0= 0  0 | 0= 0
  0 & 1= 0  0 | 1= 1
  1 & 0= 0  1 | 0= 1
  1 & 1= 1  1 | 1= 1

  3 & 2 = 0111 & 0010 = 0010 = 2

  3 ^ 5 = 0011 ^ 0101 = 0110 = 6

  规律:

    1)-1^(-1<<n) = 2^n-1

五)二进制的最高位为符号位,1代表负数,0代表正数,其余位表示数的绝对值:

)计算:

   *****因为位运算是CPU直接支持的,所以效率高*****

  正数高位为0,负数高位为1

  左移<<:正数负数都在右侧补0,负数最高位不变

  右移>>:正数补0,负数最高位不变,空位补1

  无符号右移:空位补0

  1)5 << 2:5的二进制左移两位

5的二进制:0000 0000 0000 0101
左移两位: 0000 0000 0001 0100

   2)5>>2:5的二进制右移两位

5的二进制:0000 0000 0000 0101
右移两位: 0000 0000 0000 0001

    3)-5>>2:-5的二进制右移两位(不是很懂)

-5的二进制:1111 1111 1111 1011
右移两位:  1111 1111 1111 1110

   面试题:

    1)用最有效率的方法计算2乘以8:

      常见的JDK源码里面HashMap的默认容量16:int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

    2)传递两个非0的int数值进去,实现变量交换的方式:

      关于异或运算符的规律:一个数与另一个数异或两次是其本身, 一个数和自身异或结果是0

        int a = 2; int b = 3;

      先:a = a^b;

      再:b = b^a; a = a^b

参考:https://www.jianshu.com/p/927009730809

原文地址:https://www.cnblogs.com/ericguoxiaofeng/p/12535985.html