前言
做java那么多年,基础运算符,三目运算符,逻辑运算符等等都是用得很多,第一次听说位运算符还是看面试题了解的,当然也没有详细去了解,其实用得比较少吧,不过看到了还是有必要记录一下。
位运算符:
一个七个
&(与) |(或) ^(异或) ~(取反) >>(右移) <<(左移) >>>(无符号右移)
java中的位运算符只针对二进制,所以也可称为二进制运算符,也就说我们使用位运算的时候,需要将值转换成二进制,在去比较。
注意一下,二进制中1 我们认为是true 0表示false
& 与运算符
比如我们 4&7 如何运算
先将4和7分别转换成二进制的数据(因为一个字节有8位,所以前面不足的补 0)
再一列一列的比较
两个都为true(1) 该列结果为1
其中一个false(0) 该列结果为0 有点类似 && 与
那么结果:0000 0100 再换算成10进制 刚好也是 4
| 或运算符
这个就和上面的类似了如:
4 | 7
一样的比较
两列都为 false(0) 结果false(0)
随意一列为true(1) 结果为 true(1)
结果可见 0000 0111 为:7
^ 异或运算符
4^7
这个比较方式是:
两个相同:false(0)
两个不同:true(1)
结果:0000 0011 为:3
~ 取反运算
~7
运算方式:
原来是1 取0 原来是0就取1
结果:0000 1000
注意:二进制中,最高位是符号位 1表示负数,0表示正数
所以结果应该是 -8
可以这样记: ~n = -(n+1) ~-n = n-1
<< 左移运算
就是把这个数左移几位:
12 << 2
12的二进制 : 0000 1100
左移变成了 0011 0000 (后面补0)
结果是 96
记忆: m<<n 等于 m*2^n (数学运算:m*(n*n))
>> 右移运算
一个道理
12>>2
右移:0000 0011 结果为 :2
记忆:m>>n 等于 m/2^n
>>> 无符号位移
只对32和64位有效
在移动位的时候与右移运算符的移动方式一样的,区别只在于补位的时候不管是0还是1,都补0
总结:
位运算符不常用,偶尔面试会提到。作为记忆吧,以后忘了可以回顾一下