运算符的奥义

在看hollischuang的成神之路,其中看到HashMap的容量与扩容,这个十分常见,只知其中理论对于其源码并没有细看,这一次关注到HashMap中还有一个和他们紧密相关的概念:capacity

容量,如果不指定,默认容量是16(static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;)
那么 1 << 4 为什么等于16 ? 于是乎就带着疑问寻找答案

^ , | , & , >> , << , >>> , <<< , ~

  • 按位异 ^:【不同的则为真】

    • 异或运算符顾名思义,异就是不同,其运算规则为10 = 1 , 1^1 = 0 , 0^1 = 1 , 0^0 = 0

    5的二进制位是0000 0101 , 9的二进制位是0000 1001,也就是0101 ^ 1001,结果为1100 , 00001100的十进制位是12

  • 按位与 & :

    • 因为0和任何数做与,结果都为0

    • 运算规则即(两个为真才为真) 1&1=1 , 1&0=0 , 0&1=0 , 0&0=0

    3的二进制位是0000 0011 , 5的二进制位是0000 0101 , 那么就是011 & 101,由按位与运算规则得知,001 & 101等于0000 0001,最终值为1

    7的二进制位是0000 0111,那就是111 & 101等于101,也就是0000 0101,故值为5

  • 按位或 | :

    • 运算规则即(一个为真则为真) 1|0 = 1 , 1|1 = 1 , 0|0 = 0 , 0|1 = 1

    6的二进制位0000 0110 , 2的二进制位0000 0010 , 110|010为110,最终值0000 0110,故6|2等于6

  • 右移运算符:>>

凡位运算符都是把值先转换成二进制再进行后续的处理,5的二进制位是0000 0101,右移两位就是把101左移后为0000 0001,正数左边第一位补0,负数补1,等于除于2的n次方,结果为1

  • 左移运算符:<<

5<<2的意思为5的二进制位往左挪两位,右边补0,5的二进制位是0000 0101 , 就是把有效值101往左挪两位就是0001 0100 ,正数左边第一位补0,负数补1,等于乘于2的n次方,十进制位是20

  • 无符号右移运算符:>>>

    • 正数无符号右移

      正数无符号右移

      无符号右移运算符和右移运算符的主要区别在于负数的计算,因为无符号右移是高位补0,移多少位补多少个0。

      15的二进制位是0000 1111 , 右移2位0000 0011,结果为3

    • 负数无符号右移

      -6的二进制是6的二进制取反再加1,6的二进制也就是0000 0000 0000 0000 0000 0000 0000 0110,取反后加1为1111 1111 1111 1111 1111 1111 1111 1010,右移三位0001 1111 1111 1111 1111 1111 1111 1111

  • 无符号左移运算符:<<<

  • 取反运算符: ~

(反码加1称为补码。)步骤就是先求出这个数(因为java存的数是补码)的原码,然后对原码取反得到X,这个X就是我们要求的那个数的补码

取反就是1为0,0为1,5的二进制位是0000 0101,取反后为1111 1010,值为-6

例如 57的二进制数是原码(表示一个字节 8bit) 0011 1001

,~表示按位取反

其57按位取反后二进制表示为(表示一个字节 8bit) 1100 0110

1100 0110 (最前面的第一位表示符位 )

1表示次数为负数

1100 0110 可表示为 -(26+22+2^1) = -70;

负数在计算机里面要用补码来表示

即补码=符号位以后的按位取反后加1

反之减1

所以 -70 = 1100 0110 符号位以后按位取反后再加一为 1011 1010 = -58

即~57 = -58;

WRITTEN BY:    Richard

I'm discombobulated !