位移运算
掌握最基本的移位运算符知识还是很有必要的,这不光可以帮助我们在代码中使用,还可以帮助我们理
解源码中涉及到移位运算符的代码。
虽然移位运算本质上可以分为左移和右移,但在实际应用中,右移操作需要考虑符号位的处理方式。
由于 double,float 在二进制中的表现比较特殊,因此不能来进行移位操作。
移位操作符实际上支持的类型只有int和long,编译器在对short、byte、char类型进行移位前,都会将其
转换为int类型再操作。
当 int 类型左移/右移位数大于等于 32 位操作时,会先求余(%)后再进行左移/右移操作。也就是说左
移/右移 32 位相当于不进行移位操作(32%32=0),左移/右移 42 位相当于左移/右移 10 位
(42%32=10)。当 long 类型进行左移/右移操作时,由于 long 对应的二进制是 64 位,因此求余操作的
基数也变成了 64。
使用移位运算符的主要原因:
高效:移位运算符直接对应于处理器的移位指令。现代处理器具有专门的硬件指令来执行这些移位
操作,这些指令通常在一个时钟周期内完成。相比之下,乘法和除法等算术运算在硬件层面上需要
更多的时钟周期来完成。
节省内存:通过移位操作,可以使用一个整数(如 int 或 long)来存储多个布尔值或标志位,从而节
省内存。
移位运算符最常用于快速乘以或除以 2 的幂次方。除此之外,它还在以下方面发挥着重要作用:
位字段管理:例如存储和操作多个布尔值。
哈希算法和加密解密:通过移位和与、或等操作来混淆数据。
数据压缩:例如霍夫曼编码通过移位运算符可以快速处理和操作二进制数据,以生成紧凑的压缩格
式。
数据校验:例如 CRC(循环冗余校验)通过移位和多项式除法生成和校验数据完整性。。
内存对齐:通过移位操作,可以轻松计算和调整数据的对齐地址。
Java 中有三种移位运算符:
<< 左移运算符,向左移若干位,高位丢弃,低位补零。x << n,相当于 x 乘以 2 的 n 次方(不溢出的情况下) 人
话:前面的截断N的长度后面的补N的长度个0
>> 右移运算符,向右移若干位,高位补符号位,低位丢弃。正数高位补 0,负数高位补 1。x >> n,
相当于 x 除以 2 的 n 次方。人话:后面的截断N的长度前面的补N的长度个0或1取决于是正数还是负
数
>>> 无符号右移,忽略符号位,空位都以 0 补齐。人话:右移后左边空出的位用零来填充。移出右边
的位被丢弃。高位始终补 0,无论原数是正数还是负数
使用注意事项
如果移位的位数超过数值所占有的位数会怎样?
1.
2.
3.
1.
2.
3.
1.
也就是说:x<<42等同于x<<10,x>>42等同于x>>10,x >>>42等同于x >>> 10。
左移运算符代码示例:
由于左移位数大于等于 32 位操作时,会先求余(%)后再进行左移操作,所以下面的代码左移 42 位相
当于左移 10 位(42%32=10),输出结果和前面的代码一样。
位运算符:
1
2
3
4
5
6
7
8
9
10
11
A&B表示二进制同位都是1,结果才是1,否则为0
A|B表示二进制同位只要有一位是1,结果就是1,否则为0
A^B表示二进制同位互为相反数,结果就是1,否则为0
~A表示二进制位为0,结果是1,如果位为1,结果是0
12
13
14
15
16
17
18
本文整理自实践经验,如有问题欢迎交流讨论。