Java的位运算

date
Feb 14, 2019
slug
Java的位运算
status
Published
tags
Java
summary
type
Post
  1. Java的位运算有6种
      • << 左移
      • >> 右移
      • & 位与,按位去与运算
      • | 位或,按位取或运算
      • ~ 位非,每位按位取反
      • ^ 位异或,按位计算,相同位0,不同为1
  1. 负数在计算机中以补码的形式存在,正数补码=原码,负数补码=绝对值的反码+1
    1. 以下是int类型数的储存形式:
      • 5 :正数直接用原码表示 00000000 00000000 00000000 00000101
      • -5: 先算出5的反码 11111111 11111111 11111111 11111010 ,反码+1得出-5的补码11111111 11111111 11111111 11111011
  1. 最高位是符号位,0代表正数,1代表负数,符号位也参与运算;
      • 运算结果最高位为0时,结果就是原码,例如:位运算后结果是00000000 00000000 00000000 00000001 那么结果就是1;
      • 运算结果最高位是1,那么运算结果是补码,需要求得原码,例如,运算结果是11111111 11111111 11111111 11111110 ,最高位是1,是负数,减一得到11111111 11111111 11111111 11111101 ,位反转得到原码00000000 00000000 00000000 00000010 ,最后得到运算结果是-2
  1. 其中右移又分 有符号右移 >>无符号右移 >>> ,正数有符号右移高位补0,负数有符号右移补1,无符号右移高位全部补0,左移低位全部补0

一些例子:

  • 5>>3=0
    • 00000000 00000000 00000000 00000101 右移3位得到00000000 00000000 00000000 00000000 ,转换成十进制就是0
  • -5>>3=-1
    • 11111111 11111111 11111111 11111011 右移3位得到11111111 11111111 11111111 11111111 ,由于是补码所以要先减1得到11111111 11111111 11111111 11111110,再位反得到原码00000000 00000000 00000000 00000001 ,值是1,因为是负数,所以结果是-1.
  • -5>>>3
    • 右移3位得到:00011111 11111111 11111111 11111111 最高位是0,结果变成正数,所以值是2^30+2^29+....2^1+2^0=536870911
       

© Ryan Tang 2021 - 2025