位移运算符 >> << >>> 异或^

位移运算符:

static final int tableSizeFor(int cap) {
        int n = cap - 1;
        n |= n >>> 1;
        n |= n >>> 2;
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
    }

int e = 12345 为例进行解析:

12345 二进制表达:

![image-20210926095216550](/Users/chentao/Library/Application Support/typora-user-images/image-20210926095216550.png)

位移后十进制数值变成:24690,刚好是12345的二倍,所以有些人会用左位移运算符代替乘2的操作,但是这并不代表是真的就是乘以2,很多时候,我们可以这样使用,但是一定要知道,位移运算符很多时候可以代替乘2操作,但是这个并不代表两者是一样的

![image-20210926095435644](/Users/chentao/Library/Application Support/typora-user-images/image-20210926095435644.png)

左位移18位后,二进制首位为1

![image-20210926095510622](/Users/chentao/Library/Application Support/typora-user-images/image-20210926095510622.png)

此时二进制表达首位为1,此时数值为 -1058799616,同理,如果继续位移,左位移20位,则值为 59768832 又变成了正数

所以根据这个规则,如果任意一个十进制的数左位移32位,右边补位32个0,十进制岂不是都是0了?当然不是!!! 当int 类型的数据进行左移的时候,当左移的位数大于等于32位的时候,位数会先求余数,然后再进行左移,也就是说,如果真的左移32位 e << 32 的时候,会先进行位数求余数,即为 e<<(32%32) 相当于 e<< 0 ,所以e<< 33 的值和e<<1 是一样的,都是 24690

异或:

参与运算的两个值,如果两个相应bit位相同,则结果为0,否则为1。

即:

  0^0 = 0,

  1^0 = 1,

  0^1 = 1,

  1^1 = 0

  按位异或的3个特点:

  (1) 00=0,01=1 0异或任何数=任何数

  (2) 10=1,11=0 1异或任何数-任何数取反

  (3) 任何数异或自己=把自己置0

  按位异或的几个常见用途:

  (1) 使某些特定的位翻转

  例如对数10100001的第2位和第3位翻转,则可以将该数与00000110进行按位异或运算。

  10100001^00000110 = 10100111

  (2) 实现两个值的交换,而不必使用临时变量。

  例如交换两个整数a=10100001,b=00000110的值,可通过下列语句实现:

  a = a^b;   //a=10100111

  b = b^a;   //b=10100001

  a = a^b;   //a=00000110

posted @ 2021-09-26 11:32  落笔生花  阅读(216)  评论(0)    收藏  举报