Java中的位运算

2019/08/05 Java

在计算机中所有数据都是以二进制的形式储存的。Java 中的位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快。在实际编程中,如果能巧妙运用位操作,完全可以达到四两拨千斤的效。基本的位运算符有与、或、异或、取反、左移、右移和无符号右移。


  • 符号是:&, 含义:按位与,双目运算符
  • 相同位都为 1 时,结果才为 1。否则该位为 0
  • 3->11, 4->100。可得结果,从右边起,第一位是0,第二位是0,第三位是0。故可得,3 & 4 = 0
  • 3->11, 7->111。可得结果,从右边起,第一位是1,第二位是1,第三位是0。故可得,3 & 7 = 3

  • 符号是:|,含义:按位或,双目运算符
  • 相同位都为 0 时,结果才为 0。否则该位为 1
  • 3->11, 4->100。可得结果,从右边起,第一位是1,第二位是1,第三位是1。故可得,3 & 4 = 7
  • 3->11, 7->111。可得结果,从右边起,第一位是1,第二位是1,第三位是0。故可得,3 & 7 = 7

异或

  • 符号是:^,含义:按位异或,双目运算符
  • 相同位相同时,结果为 0。相异是为 1
  • 3->11, 4->100。可得结果,从右边起,第一位是1,第二位是1,第三位是1。故可得,3 & 4 = 7
  • 3->11, 7->111。可得结果,从右边起,第一位是0,第二位是0,第三位是1。故可得,3 & 7 = 4

取反

  • 符号是:~,单目运算符
  • 0 变 1,1 变 0
  • 3->11, 可得 ~3 = -4
  • 6->110,可得 ~6 = -7

左移

  • 符号是:<<,含义:按位左移,双目运算符。
  • int 类型左移位数大于等于32位操作时,会先求余(%)后再进行左移操作。
  • 最左侧第一位是符号位, 0 代表正数,1 代表负数。
  • 定义十进制整数:int value = 733183670,转换为二进制如下图:

左移图例1

value << 1, 如下图:

左移图例2

左移1位后换算成十进制的值为:1466367340,刚好是733183670的两倍。

value << 8,如下图:

左移图例3

右移

  • 符号是:>>,含义:按位右移,双目运算符。
  • int 类型右移位数大于等于32位操作时,会先求余(%)后再进行左移操作。
  • 定义十进制整数:int value = 733183670,转换为二进制如下图:

右移图例1

value >> 1, 如下图

右移图例2

value >> 8, 如下图

右移图例2

无符号右移

  • 符号是:>>>, 含义:按位右移,保留原来的符号位,双目运算符。
  • int 类型右移位数大于等于32位操作时,会先求余(%)后再进行左移操作。
  • 对于正数移位来说等同于:>>,负数通过此移位运算符能移位成正数。
  • 定义十进制整数:int value = -733183670

value >> 8, 如下图:

右移图例2

Search

    Table of Contents