位运算总结

位运算

  • 有符号整数
  • 无符号整数
  • 位移运算

1计算机中数字的表示

  • 计算机只有0,1两个数字,所以我们常用的10进制计算

  • 所以我们需表示10进制

  • 要使用二进制来表示10进制数

进制表示法

我们假设一个 8 位的数据类型

方案1

2:0000 0010

我们会发现这样无法表示负数

方案2:原码表示法

最高位表示正负(0正1负),剩余7位表示数值

2: 0000 0010

-2:1000 0010

计算2+(-2)

位运算总结_第1张图片

我们发现结果为 1000 0100,翻译为10进制为 -4 ;同样出现了问题

方案三:补码表示法

  • 补码规则:正数的补码与原码一样;负数:对其绝对值按位取反,+1;
  • 反码:符号位不变,其余位数取反(0—>1,1—>0)
  • 补码:反码+1

-3

先计算-3绝对值的二进制 00000011

取反:11111100

加1:11111101(这就是计算级的-3表示)

2. 规则总结(有符号数)

  • 二进制最高位是符号位:0正1负
  • 正数的原码,反码,补码都一样
  • 负数的反码:符号位不败,其余取反
  • 负数的补码:反码+1
  • 0的补码,反码都是0
  • 计算机运算时使用补码来运算

3. 有符号运算案例

1+1

1的补码: 0000 0001

0000 0001+0000 0001=0000 0010 即10进制的2

1-2

  • 将两个数转换为补码

1的补码: 0000 0001

-2 的原码: 1000 0010

-2的反码:1111 1101

-2的补码:1111 1110

1111 1110 +0000 0001=1111 1111

  • 将结果反推回去

先-1 的到反码 1111 1110

在得到原码 1000 0001 即 10进制表示的 -1(答案正确)

位运算

  • 逻辑运算符

    • &:与,
    • ^:异或,无进位加法
    • |:或:有1则为1
  • 位移运算符

    • <<:左移

    位运算总结_第2张图片

    • 在一些特殊情况下 可以当作*2 使用,但是需要注意二者并不等价,比如 我们左移30位 数字正负都会发生变化
    • 规矩这个规则,任意一个10进制数都会变为0,所以当int 左移位数大于等于32位时,会先求余数,在进行左移即
      • 左移32位相当于不移动
      • 33位相当于移动1位
    • >>:右移

    • >>>:无符号右移

      正数

      10 :0000 1010

      10>>2 0000 0010 —>2

      10>>>2 0000 0010—>2

      我们可以发现对于正数而言其结果一样

      负数

      -10 原码 :1000 1010

      ​ 反码:1111 0101

      ​ 补码:1111 0110

      -10 >>2 1111 1101 (取前6位,高位补1) —》变换回原数:-3

      -10 >>2 0011 1101(取前6位,高位补0)—> 195

      负数二者运算结果不一样

你可能感兴趣的:(算法)