位运算符
对于任何编程语言而言,最终的操作都是二进制表示,因为计算机只认识二进制,而八进制,十进制或者十六进制都是为了让开发人员方便开发 。对于 Java 来说,也可以针对数的某个值进行运算 。这就需要位运算符的参与了 。也是为了方便对二进制进行操作 。
位运算符主要有一下运算符:
位与
按位与和逻辑运算符的逻辑与很类似,一个比较的表达式,一个是按照位来进行判断 。在二进制中,位与的判断为都为 1 的记做 1 否则记做 0 。
按位与规则如下:
00 = 0;
01 = 0;
10 = 0;
11 = 1;
先看一个都是正整数的值 102 。
最终得出结果 0000 10100000 0010 = 0000 0010 转换成十进制就是2 。
对于负值的位与运算有点区别的地方就是参与运算的是补码 。
举例说明: 10-2
具体如何得到补码,可以参考我之前写的文章基础类型的相互转换 。这里对于负值的情况需要了解什么是原码 , 反码和补码 。参与运算的是补码 。-2 的原码是 1000 0010反码是 1111 1101 补码 在反码的基础最后一位加 1 得到1111 1110 。
最终结果得到 0000 10101111 1110 = 0000 1010 十进制也就是 10 。
这个时候怎么校验结果是否正确呢? 直接写 Java 代码就好了,打开 jshell:
位或 |
按位或 , 和逻辑或很类似,只要二者有一位 1 结果就是 1 。
按位或规则如下:
0 | 0 = 0;
0 | 1 = 1;
1 | 0 = 1;
1 | 1 = 1;
根据上面的运算得到了 10 | 2 = 10 。
负值有略有不同 。
还是要灵活运用原码反码和补码,特别是负数的情况下,因为正数的原码和补码一致 。
位反 ~
按位反, 和逻辑非类似 。是对位进行直接取反 。
按位反规则如下:
~1 = 0;
~0 = 1;
先用 2 进行运算处理:
在进行 -2 的运算操作
-2 的原码 需要转换成补码 , 用补码进行取反运算 。得到 1 的二进制 。
代码演示如下:
位异或 ^
位异或是基于二进制的位运算 。采用符号 XOR 在 Java 中使用 ^ 进行表示 。两个值相同取 0, 不同的取 1 。
按位异或规则如下:
1 ^ 1 = 0;
0 ^ 0 = 0;
1 ^ 0 = 1;
0 ^ 1 = 1;
举例 10 ^ 2
举例 10 ^ -2
代码演示结果的准确性:
异或在代码优化和实际的工作中会经常用到 。后续实战中用到了在详细分析用法,现在知道进行异或运算即可 。
位左移
将一个操作数进行二进制位往左移, 移动后空出来的低位用 0 进行填充 。移除的高位舍去 。高位丢弃,低位补零 。
操作数移动的位数
举例说明 102
位左移代码演示:
位右移
将一个操作数进行二进制往右移,移动后,有两种情况,一种有无符号一种是有符号 。也就是最高位为 0 移动后高位补 0,如果最高位(符号位)为 1, 移动后空缺位都为 1.
操作数移动的位数
举例说明 102
对于负数举例 -22 空缺位补 1:
位右移代码演示:
注意这两者的区别 。
无符号位右移
这个是和右移操作上是一致的 , 但是不管是否最高位(符号位)为 1,空缺位都使用 0 进行补齐 。
操作数移动的位数
举例说明 102
对于负数来说 。这里有点区别 , 因为对于负值来说,上面其实都是 32 位 , 为了让大家看起来舒服转换成了对应的 8 位的 。因为无符号位右移会改变正负值,所以 32 位的负值和 8 位的负值是不一致的 。
并且 Java 在处理 byte, short , char 等值进行移位操作前,会先将类型转换成 int 因为 int 占用 32 位 。
- 如何使用cmd命令行提示符登录mysql服务器 cmd中登陆mysql
- mysql怎么把两个字段拼在一起 mysql字段拼接中文
- mysql中ext
- mongodb数据丢失原因 为什么mongodb数据库一直在加载中
- mysql中删除记录的命令 mysql删除中继日志
- redis怎么获取list的值 redis中存取list
- redis事务实现原理 在事务中使用redis
- java查询数组中是否包含某一个值 javamongodb数组查询
- mongodb聚合查询优化 mongodb聚合运算需要索引吗
- mysql 游标遍历 mysql游标取多变量
