位运算符
按位操作符用来操作整数基本数据类型中的单个比特(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的移位运算符有三种。
练习:取出一个二进制的某一段。
使用异或(^)数据对数据加密
对两个变量的值进行互换。
方式1:
对两个变量进行值交换(不能使用第三个变量)
方式2:
两个数相加的时候,值有可能超出int表示范围,不推荐。
方式3:
该方式虽然效率高,而且避免了超出int值,但是可读性较差。
三种方式都可以对两个变量的值进行交换,但是推荐使用第一种。(面试除外)
author@nohert