Skip to content

Latest commit

 

History

History
40 lines (31 loc) · 1.62 KB

二进制负数表示.md

File metadata and controls

40 lines (31 loc) · 1.62 KB

二进制负数表示

2022-08-10 15:51:41

今天在学习 ts enum 时,在尝试自定义每项数据关联的数字时,使用了二进制数来表示

enum AnimalFlags {
  None        = 0,
  HasClaws    = 1 << 0,
  CanFly      = 1 << 1
}
~AnimalFlags.HasClaws

这里使用了二进制操作符按位非的方式表达,比如 ~1 的值为 -2,执行过程如下

  1. 1 的源码为 00000000 00000000 00000000 00000001
  2. ~1 按位非为 11111111 11111111 11111111 11111110
  3. 由于以 1 开头,表示负数,那么就需要计算其负数的十进制表示法
  4. 计算反码 00000000 00000000 00000000 00000001,注意按位非的反码就是原本数的源码
  5. 再计算补码,也就是反码 +1 00000000 00000000 00000000 00000010,其值为 2
  6. 计算结果:符号 + 值,表示 -2

同理推断负数的按位非 ~-2 的值,负数要先计算源码

  1. -2 的补码为 00000000 00000000 00000000 00000010
  2. 计算反码 00000000 00000000 00000000 00000001
  3. 计算源码 11111111 11111111 11111111 11111110
  4. 再按位非 00000000 00000000 00000000 00000001
  5. 正数直接计算值,表示 1

基础知识

  1. 数字采用4个字节表示,也就是32位;英文1个字节,中文2-3个字节
  2. 负数在计算机中是以补码的方式表示的,也就是说 源码 -> 反码 -> 反码 + 1 = 补码
  3. 负数和正数计算 & | ~ 都是从源码开始的,负数得先计算源码

按位非 ~ 计算规律总结:数值加1,符号取反,比如 ~10 === -11, ~-17 === 16

参考文章

负数的二进制表示