Administrator
发布于 2026-01-09 / 0 阅读
0
0

位移运算

位移运算

掌握最基本的移位运算符知识还是很有必要的,这不光可以帮助我们在代码中使用,还可以帮助我们理

解源码中涉及到移位运算符的代码。


虽然移位运算本质上可以分为左移和右移,但在实际应用中,右移操作需要考虑符号位的处理方式。

由于 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),输出结果和前面的代码一样。


位运算符:

  • A&B表示二进制同位都是1,结果才是1,否则为0 “与”
  • 1

  • 与&
  • 2

  • 1100100
  • 3

  • 0110010
  • 4

  • 0100000
  • 5

  • A|B表示二进制同位只要有一位是1,结果就是1,否则为0 “或”
  • 6

  • 1100100
  • 7

  • 0110010
  • 8

  • 1110110
  • 9

  • A^B表示二进制同位互为相反数,结果就是1,否则为0 “异或”
  • 10

  • 异或 ^
  • 11

    A&B表示二进制同位都是1,结果才是1,否则为0

    A|B表示二进制同位只要有一位是1,结果就是1,否则为0

    A^B表示二进制同位互为相反数,结果就是1,否则为0

    ~A表示二进制位为0,结果是1,如果位为1,结果是0





  • 1100100
  • 12

  • 0110010
  • 13

  • 1010110
  • 14

  • ~A表示二进制位为0,结果是1,如果位为1,结果是0 “非”
  • 15

  • 非 ~
  • 16

  • 1100100
  • 17

  • 11111111111111111111111110011011
  • 18


    本文整理自实践经验,如有问题欢迎交流讨论。


    评论