位运算符底层逻辑

400 阅读4分钟

位逻辑运算符

  •         组成及用法:

           位逻辑运算符包含 4 个:

                    &(与): 其运算规则是:参与运算的数字,低位对齐,高位不足的补零,如果对应的二进制位同时为 1,那么计算结果才为 1,否则为 0。因此,任何数与 0 进行按位与运算,其结果都为 0。

                     |(或): 其运算规则是:参与运算的数字,低位对齐,高位不足的补零。如果对应的二进制位只要有一个为 1,那么结果就为 1;如果对应的二进制位都为 0,结果才为 0。

                     ~(非,取反):其运算规则是:只对一个操作数进行运算,将操作数二进制中的 1 改为 0,0 改为 1。

                     ^(异或):其运算规则是:参与运算的数字,低位对齐,高位不足的补零,如果对应的二进制位相同(同时为 0 或同时为 1)时,结果为 0;如果对应的二进制位不相同,结果则为 1。

                ps:除了~(即位取反)为单目运算符外,其余都为双目运算符。

  •         运算过程实例详解:

              &(与 ) 例子:例如下面的表达式

100&0 其运算过程为:

                                                                         0000    0000    1100    1000             [100]

                                                             &       0000    0000    0000    0000             [  0  ]


                                                                         0000    0000    0000    0000           

                                                  二进制位同时为 1,那么计算结果才为 1,否则为 0 这个运算过程,结果为 0。这个运算过程,结果为 0。

 

*5&12 其运算过程为: *                         

                                                                         0000    0000    0000     0101             [ 05 ]

                                                             &        0000    0000    0000    1100              [ 12 ]


                                                                         0000    0000     0000    0100             [ 04 ]               

                                                   二进制位同时为 1,那么计算结果才为 1,否则为 0 这个运算过程,结果为 0。这个运算过程,结果为 4。

                |(或)例子:例如下面的表达式

11|7 其运算过程为:

                                                                         0000     0000    0000    1011             [ 11 ]

                                                                 |        0000     0000    0000    0111             [  7  ]


                                                                         0000     0000    0000    1111             [ 15 ]                

                                                    二进制位只要有一个为 1,那么结果就为 1;如果对应的二进制位都为 0,结果才为 0。这个运算过程,结果为 15。

                 ~(非,取反)例子:例如下面的表达式

~10 其运算过程为:

******   0000    0000    0000    1010              [ 10 ]


                                                             **   ~**  1111    1111    1111    0101            [65525]

                                                     只对一个操作数进行运算,将操作数二进制中的 1 改为 0,0 改为 1。这个运算过程,结果为 15。

                      ^(异或)例子:例如下面的表达式

                                                                           0000    0000    0000    1011             [ 11 ]

                                                               ^       0000    0000    0000    0111            [  7  ]


                                                                            0000    0000    0000    1100            [ 12 ]

                                                     二进制位相同(同时为 0 或同时为 1)时,结果为 0;如果对应的二进制位不相同,结果则为 1。这个运算过程,结果为 12。

补充:  >> 和 << 运算符可以将位移模式左移或右移

     ******位移运算符用来将操作数向某个方向(向左或者右)移动指定的二进制位数。表 2 列出了 Java 语言中的两个位移运算符,它们都属于双目运算符。

<< 为左位移运算符: 其运算规则是:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。

             >> 为右位移运算符: 其运算规则是:按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补零。

例子:                                                                 0000    0000    0000    1011             

                                                         <<            00000    0000    0001    0110

                                                                         移除                                    补零