关于计算机的原码,反码和补码

关于计算机的原码,反码和补码

这是底层重点,下面的各级规定必须背会

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

四个位运算符

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

举例

  1. 2&3=? 2的补码:

    0000 0000 0000 0000 0000 0000 0000 0010

    3的补码:

    0000 0000 0000 0000 0000 0000 0000 0011

    2&3的补码:

    0000 0000 0000 0000 0000 0000 0000 0010

    2&3的原码:

    0000 0000 0000 0000 0000 0000 0000 0010 (2)

  2. ~-2=? -2的反码:

    1111 1111 1111 1111 1111 1111 1111 1101

    -2的补码:

    1111 1111 1111 1111 1111 1111 1111 1110

    取反:

    0000 0000 0000 0000 0000 0000 0000 0001

    原码:

    0000 0000 0000 0000 0000 0000 0000 0001(1)

  3. ~2=? 2的补码:

    0000 0000 0000 0000 0000 0000 0000 0010

    取反:

    1111 1111 1111 1111 1111 1111 1111 1101

    补码转反码:

    1111 1111 1111 1111 1111 1111 1111 1100

    反码再变回原码:

    1000 0000 0000 0000 0000 0000 0000 0011(-3)

  4. 2|3=?

    2的补码:

    0000 0000 0000 0000 0000 0000 0000 0010

    3的补码:

    0000 0000 0000 0000 0000 0000 0000 0011

    或运算:

    0000 0000 0000 0000 0000 0000 0000 0011

    补码变反码变原码:

    0000 0000 0000 0000 0000 0000 0000 0011(3)

  5. 2^3=? 2的补码:

    0000 0000 0000 0000 0000 0000 0000 0010

    3的补码:

    0000 0000 0000 0000 0000 0000 0000 0011

    异或运算:

    0000 0000 0000 0000 0000 0000 0000 0001(1)

位运算的妙用

可直接使用 (m&1)==1?奇数:偶数 获得结果*,如:

1
2
3
    boolean a = (3&1)==1              //true

    boolean b = (4&1)==1            //false

不用临时变量交换两个整数的值:

1
2
3
4
5
6
7
    int a = 3, b = 4

    a = a^b

    b = a^b        // b = 3

    a = a^b        // a = 4

原理:

异或0具有保持的特点,即1010^0000 = 1010;

异或1具有翻转的特点,即1010^1111 = 0101;

由此可推导:

b^(a^b) = a

a^(b^(a^b)) = b

三个位移运算符

  • 算数右移»:低位溢出。符号位不变,并用符号位补溢出的高位。
  • 算数左移«:符号位不变,低位左移补0
  • 逻辑右移»>:也叫无符号右移,低位溢出高位补0
1
2
int a=1>>2;  	//相当于1/2/2
int a=1<<2;		//相当于1*2*2
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计