位运算
在计算机中 , 所有的数据都是以二进制的(0,1)形式存储在设备中 , 而位运算就是运算这些二进制数据
我们最了解的就是十进制 , 除了十进制 , 还有二进制 , 六进制 , 八进制等等 , 由于位运算操作就是二进制 , 所以我们主要来说一下二进制 , 十进制的个位有(0~9)这几个数字 , 而二进制也相同 , 二进制的个位上只有0和1
我们在运用java语言进行编码时 , 遇到最小的单位就是字节 , 而一个字节就是8位 , 每一位都是0或者1, 如下图所示
运算符
在了解运算符之前我们需要知道 : 1表示true,0表示false
符号
含义
运算逻辑
&
按位与
全true(1),即为true(1)
全false(0),即为false(0)
一个false(0)一个true(1),还是false(0)
|
按位或
有true(1)就是true(1)
无true(1)就是false(0)
^
按位异或
只要相同都是false(0)
只有不同才是true(1)
~
按位取反
把1变0,0变1
<<
左移
把所有位向左移动N位(比如5 << 2 就是向左移动两位) , 右边两位补0 , 左边两位去掉
>>
右移
把所有位向右移动N位(比如5 >> 2 就是向右移动两位) , 如果这个数是负数则补1 , 否则补0 , 右边两位去掉
>>>
无符号右移 针对32位和64位 , 所有位向右移动 ,左边位补0
例: 我们以下几个数字来演示下面几个例子
5的二进制对应为 : 00000101
-5的二进制为: 11111011
7的二进制对应为 : 00000111
2的二进制对应为 : 00000010
正数的二进制转换为负数的二进制 : 先取反 , 再 + 1 , 如 5转换为-5 , 二进制表示就是 :
00000101 取反 -> 11111010 加1 -> 11111011
负数的二进制转换为正数的二进制 : 先取反 , 再 - 1
11111011 取反 -> 00000011 减1 -> 00000010
需要注意的是 int 类型占4字节 , 所以对应的二进制应该是32位的 , 这里我们只用后面的8位进行演示
按位与: 5 & 8
全true(1),即为true(1) , 全false(0),即为false(0) , 一个false(0)一个true(1),还是false(0) ,运算后得到 : 00000101, 也就是 5
按位或 : 5 | 7
有true(1)就是true(1) , 无true(1)就是false(0) , 运算后得到 : 00000010, 也就是 2
按位异或 : 5 ^ 7
只要相同都是false(0) , 只有不同才是true(1) , 运算后得到 : 0000010 , 也就是 5
按位取反 : ~5
0变为1 , 1变为0 , 运算后得到 : 11111010, 也就是 250
按位左移 : 5 << 2
把所有位向左移动两位 , 右边两位补0 , 左边两位去掉 , 运算之后得到: 00010100 , 也就是20
按位右移 : 5 >> 2
把所有位向右移动两位 , 如果这个数是负数则补1 , 否则补0 , 右边两位去掉
5是正数 , 所以补0 , 如果5是负数 , 那么就补1 , 运算之后得到00000001 , 也就是1
-5 >> 2
运算之后得到11111110 , 也就是-2
无符号右移: 5 >>> 2
无符号右移只针对32位和64位 , 和右移差不多 , 所有位向右移动 , 唯一的区别就是左边位不管什么情况都补0
-5 >>> 2 (32位机器) , 如果是64位机器 , 在前面加32个1
运算之后得到00111111111111111111111111111110 , 也就是1073741822