位运算符

按位操作符用来操作整数基本数据类型中的单个比特(bit),就是二进制,按位操作符会对两个参数中对应的位(bit)执行布尔运算,最终生成一个结果。按位操作符来源于C语言面向底层的操作,Java设计的初衷是嵌入式电视机机顶盒,所以面向底层的操作也保留了下来。

任何信息在计算机中都是以二进制的形式保存的,”&”、“|”、“^”除了可以作为逻辑运算符也可以作为位运算符。位运算是直接对二进制进行运算。他们对两个操作数中的每一个二进制位都进行运算。例如int是由32个二进制数组成,因此使用位运算符可以对整数值的二进制数进行运算。

位(bit)运算符:

位运算符

 

运算符含义

 

&

与(AND)

|

或(OR)

^

异或

~

取反

 

规则:

可以把1当做true 0当做false

只有参与运算的两位都为1,&运算的结果才为1,否则就为0。

只有参加运算的两位都是0,| 运算的结果才是0,否则都是1。

只有参加运算的两位不同,^ 运算的结果才为1,否则就为0。

1& 与运算

& 参见运算的两位数都为1,&运算符结果才为1,否则就为0。

6&3

00000000

00000000

00000000

00000110

6

00000000

00000000

00000000

00000011

3

00000000

00000000

00000000

00000010

&  =2

 

2| 或运算

| 参与运算的两位都为0,|运算的结果才为0,否则就为1。

00000000

00000000

00000000

00000110

6

00000000

00000000

00000000

00000011

3

00000000

00000000

00000000

00000111

|  =7

 

 

 

 

 

 

3^ 异或运算

^只有参加运算的两位不同,^运算的结果才为1,否则就为0。

00000000

00000000

00000000

00000110

6

00000000

00000000

00000000

00000011

3

00000000

00000000

00000000

00000101

^  =5

 

1、 ~ 反码

就是取反,二进制只有1和0,取反就是如果为1,取反就是0,如果是0,取反就是1。

 

0000-0000

0000-0000

0000-0000

0000-0110

6

1111-1111

1111-1111

1111-1111

1111-1001

取反 -7

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

结论:当参与取反的数值是正数时,把对应的值加上负号,再-1;

      当参与取反的数值是负数时,把对应的值加上负号,再-1;

负数的表现形式就是对应的正数取反,再加1。负数的最高位肯定是1。

 

4、负数表示

负数对应的正数的二进制-1,然后取反。

-6

0000-0000

0000-0000

0000-0000

0000-0110

6

1111-1111

1111-1111

1111-1111

1111-1001

取反

1111-1111

1111-1111

1111-1111

1111-1010

加1

 

 

5、异或特点

一个数异或同一个数两次,结果还是那个数.  用处一个简单的加密思想.

6^3^3

0000-0000

0000-0000

0000-0000

0000-0110

6

0000-0000

0000-0000

0000-0000

0000-0011

^3

0000-0000

0000-0000

0000-0000

0000-0101

 

0000-0000

0000-0000

0000-0000

0000-0011

^3

0000-0000

0000-0000

0000-0000

0000-0110

结果是6

 

除了这些位运算操作,还可以对数据按二进制位进行移位操作,Java的移位运算符有三种。

 

 

练习:取出一个二进制的某一段。

 

Android 位运算符 位运算符!_位运算符

 

 

使用异或(^)数据对数据加密

Android 位运算符 位运算符!_操作符_02

 

 

对两个变量的值进行互换。

方式1:

Android 位运算符 位运算符!_位运算符_03

 

对两个变量进行值交换(不能使用第三个变量)

方式2:

Android 位运算符 位运算符!_操作符_04

 

 

两个数相加的时候,值有可能超出int表示范围,不推荐。

方式3:

Android 位运算符 位运算符!_位运算符_05

 

 

该方式虽然效率高,而且避免了超出int值,但是可读性较差。

三种方式都可以对两个变量的值进行交换,但是推荐使用第一种。(面试除外)

 

author@nohert