Java笔记(3) —— 原码、反码、补码,位运算符


 

二进制在运算中的说明

  1. 二进制是逢2进位的进位制,0、1是基本算符。数字1在不同的位上表示不同的值,按从右至左的次序,这个值以二倍递增
  2. 现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是用二进制数来表示的

对于有符号的而言:

  • 二进制的最高位是符号位:0表示正数,1表示负数 (0 -> 0, 1 -> -)
  • 正数的原码、反码、补码都一样
  • 负数的反码 = 它的原码符号位不变,其他位取反
  • 负数的补码 = 它的反码 + 1, 负数的反码 = 负数的补码 - 1
  • 0的反码、补码都是0
  • java没有无符号数,换言之,java中的数都是有符号的
  • 在计算机运算的时候,都是以补码的方式来运算的
  • 当我们看运算结果的时候,要看它的原码

位运算符

java中有7个位运算符(&、|、^、 ~、>>、<<、>>>):

  • &:按位与
    两位全为1,结果为1,否则为0
  • |:按位或
    两位有一个为1,结果为1,否则为0
  • ^:按位异或
    两位有一个为0,一个为1,结果为1,否则为0
  • :按位取反
    0 -> 1, 1 -> 0

例:

  • 2&3 =
    • int是4个字节,1个字节8比特,最开头是符号位
    • 2的补码 = 2的原码 00000000 00000000 00000000 00000010
    • 3的补码 = 3的原码 00000000 00000000 00000000 00000011
    • 2&3运算后的原码:00000000 00000000 00000000 00000010
    • 结果为2
  • ~-2 =
    • -2的原码 10000000 00000000 00000000 00000010
    • -2的反码 11111111 11111111 11111111 11111101
    • -2的补码 11111111 11111111 11111111 11111110
    • 取反操作 00000000 00000000 00000000 00000001 得到的是补码
    • 取反后的原码 = 它的补码
    • 结果为 1
  • ~2 =
    • 2的原码 00000000 00000000 00000000 00000010
    • 2的补码 00000000 00000000 00000000 00000010
    • 取反操作 11111111 11111111 11111111 11111101
    • 反码 11111111 11111111 11111111 11111100
    • 原码 10000000 00000000 00000000 00000011
    • 结果为 -3

  • **>>**:算术右移
    低位溢出,符号位不变,并用符号位补溢出的高位
  • **<<**:算术左移
    符号位不变,低位补0
  • **>>>**:逻辑右移/无符号右移
    低位溢出,高位补0
  • 无”<<<”符号

例:

  • int a = 1>>2;
    • 1 = 00000000 00000000 00000000 00000001 右移2位
    • 1 = 00000000 00000000 00000000 00000000 (01) = 0
    • 本质相当于 1 / 2 / 2 = 0
  • int a = 1<<2;
    • 1 = 00000000 00000000 00000000 00000001 左移2位
    • 1 = 00000000 00000000 00000000 00000100 = 4
    • 本质相当于 1 * 2 * 2 = 4