前言

想要使用好位运算符,我们首先需要了解的知识是:

        1.源码,反码和补码

        2.二进制中,最高位为符号位,最高位1代表负数,0代表正数。

接下来正式介绍位运算符:

        <<:逻辑左移 , 左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(高位移出舍弃,低位移入补0)
                    10<<1
                    [0]000 0000 0000 0000 0000 0000 0000 1010
                    0000  0000 0000 0000 0000 0000 0001 010[0]       //结果为20

        >>:逻辑右移  ,右移运算符,将运算符左边的对象向右移动运算符右边指定的位数(低位移出舍弃,高位移入补符号位)

                    10>>1
                     0000  0000 0000 0000 0000 0000 0000 0000 101[0]
                    [0]000 0000 0000 0000 0000 0000 0000 0000  0101      //结果为5

        >>>:无符号右移  ,跟右移运算符作用基本相同(低位移出舍弃,高位移入补0)

                    10>>>1
                     0000  0000 0000 0000 0000 0000 0000 101[0]
                     [0]000 0000 0000 0000 0000 0000 0000  0101      //结果为5

负数位移注意事项:

        以上需要注意的是负数的位移,负数的位移就先将正数转换为补码再进行位移,位移结束后不是直接将补码的二进制转换成十进制(像我一样不注意会得出错误结果)而是再次换回原码就能知道是哪个数的负数。

                    -10>>1
                     1111  1111 1111 1111 1111 1111 1111 011[0]         //10的补码 -10
                     [1]111 1111 1111 1111 1111 1111 1111 1011        //补符号位1                                                                                                                          0000 0000 0000 0000 0000 0000 0000 0101         //换回原码转十进制,结果为5

        
        还需要注意的是最高位的符号位不参加运算。

                    -10>>>1
                    1111  1111 1111 1111 1111 1111 1111 011[0]
                    [0]111 1111 1111 1111 1111 1111 1111 1011                                                                                                                                                    0111  1111 1111 1111 1111 1111 1111 1011       //结果为2147483643                                                                                                            直接转为十进制,不需要还原(尚不清楚,没找到相关解释,知情的大佬可以在评论区补充)

最后补充       

  有些人会用左位移运算符代替除2的操作,但是这并不代表是真的就是乘以2,很多时候,我们可以这样使用,但是一定要知道,位移运算符很多时候可以代替除2操作,但是这个并不代表两者是一样的(主要是与数学意义上的除2结果不同,位移后int类型数据会对结果进行取整而结果相同)。                                                                                                                                                                                      进行左位移的时候本来是0的符号位是有可能位移成1的,那结果就会从正数变成负数。并且当int类型左位移大于等于32位的时候,位数会先求余数,然后进行左移,并不会出现右补32个0结果为0的情况。