好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java中的位运算符全解

1. &(按位与运算符)

& 按位与的运算规则是将两边的数转换为二进制位,然后运算最终值,运算规则即(两个为真才为真): 1&1=1 , 1&0=0 , 0&1=0 , 0&0=0

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

public class Main {

     public static void main(String[] args) {

         // &按位与,运算符两边的条件值会先转换为2进制,然后再比对运算

         /**

          *   0 0 1 1 

          *   0 1 0 1

          *  -----------

          *   0 0 0 1

          */

         int a = 3 & 5 ;

         /**

          *   0 0 0 1

          *   0 0 1 0

          *  -----------

          *   0 0 0 0

          */

         int b = 1 & 2 ;

         System.out.println(a); // 1

         System.out.println(b); // 0

     }

}

2. |(按位或运算符)

| 按位或和 & 按位与计算方式都是转换二进制再计算,不同的是运算规则(一个为真即为真): 1|0 = 1 , 1|1 = 1 , 0|0 = 0 , 0|1 = 1

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

public class Main {

     public static void main(String[] args) {

         // |按位或,运算符两边的条件值会先转换为2进制,然后再比对运算

         /**

          *   0 0 1 1

          *   0 1 0 1

          *  -------------

          *   0 1 1 1

          */

         int a = 3 | 5 ;

         /**

          *   0 0 0 1

          *   0 0 1 0

          *  -------------

          *   0 0 1 1

          */

         int b = 1 | 2 ;

         System.out.println(a); // 7

         System.out.println(b); // 3

     }

}

3. ^(异或运算符)

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

public class Main {

     public static void main(String[] args) {

         /**

          *   0 0 1 1

          *   0 1 0 1

          *  -------------

          *   0 1 1 0

          */

         int a = 3 ^ 5 ;

         /**

          *   0 0 0 1

          *   0 0 1 0

          *  -------------

          *   0 0 1 1

          */

         int b = 1 ^ 2 ;

         System.out.println(a); // 6

         System.out.println(b); // 3

     }

}

4. <<(左移运算符)

5<<2的意思为5的二进制位往左挪两位,右边补0

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

?

1

2

3

4

5

6

7

8

9

10

public class Main {

     public static void main(String[] args) {

         /**

          * 5<<2的意思为5的二进制位往左挪两位,右边补0

          *  0 0 0 0 0 1 0 1

          *  0 0 0 1 0 1 0 0

          */

         System.out.println( 5 << 2 ); // 20

     }

}

5. >> (右移移运算符)

凡位运算符都是把值先转换成二进制再进行后续的处理

5的二进制位是0000 0101,右移两位就是把101左移后为0000 0001,正数左边第一位补0,负数补1,等于除于2的n次方,结果为1

?

1

2

3

4

5

6

7

8

9

10

public class Main {

     public static void main(String[] args) {

         /**

          * 5>>2的意思为5的二进制位往右挪两位,左边补0

          *  0 0 0 0 0 1 0 1

          *  0 0 0 0 0 0 0 1

          */

         System.out.println( 5 << 2 ); // 1

     }

}

6. ~(取反运算符)

取反就是1为0,0为1

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

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

public class Main {

     public static void main(String[] args) {

         /**

          *     0 0 0 0 0 1 0 1

          *   --------------------- 

          *     1 1 1 1 1 0 1 0

          * 

          *  1、如果 11111010 想转为负的十进制,因为最高位是1,所以先将11111001减1得到11111001

          *  2、取反 00010101,然后计算出 00000100 对应的十进制为6

          *  3、所以 11111010 最终对应的十进制为 -6

          * 

          *     1 1 1 1 1 0 1 0

          *   - 0 0 0 0 0 0 0 1

          *   ---------------------

          *     1 1 1 1 1 0 0 1

          *   ---------------------

          *     0 0 0 0 0 1 0 0

          */

         System.out.println(~ 5 ); // -6

     }

}

7. >>>(无符号右移运算符)

(1) 正数无符号右移

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

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

?

1

2

3

4

5

6

7

8

9

10

public class Main {

     public static void main(String[] args) {

         /**

          *     0000 1111

          *   ---------------

          *     0000 0011

          */

         System.out.println( 15 >>> 2 ); // 3

     }

}

(2) 负数无符号右移

-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

2

3

4

5

public class Main {

     public static void main(String[] args) {

         System.out.println(- 6 >>> 3 ); // 536870911

     }

}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容! 

原文链接:https://hengheng.blog.csdn.net/article/details/123006001

查看更多关于Java中的位运算符全解的详细内容...

  阅读:12次