2022-08-10 15:51:41
今天在学习 ts enum 时,在尝试自定义每项数据关联的数字时,使用了二进制数来表示
enum AnimalFlags {
None = 0,
HasClaws = 1 << 0,
CanFly = 1 << 1
}
~AnimalFlags.HasClaws
这里使用了二进制操作符按位非的方式表达,比如 ~1
的值为 -2
,执行过程如下
- 1 的源码为
00000000 00000000 00000000 00000001
- ~1 按位非为
11111111 11111111 11111111 11111110
- 由于以 1 开头,表示负数,那么就需要计算其负数的十进制表示法
- 计算反码
00000000 00000000 00000000 00000001
,注意按位非的反码就是原本数的源码 - 再计算补码,也就是反码 +1
00000000 00000000 00000000 00000010
,其值为 2 - 计算结果:符号 + 值,表示
-2
同理推断负数的按位非 ~-2
的值,负数要先计算源码
- -2 的补码为
00000000 00000000 00000000 00000010
- 计算反码
00000000 00000000 00000000 00000001
- 计算源码
11111111 11111111 11111111 11111110
- 再按位非
00000000 00000000 00000000 00000001
- 正数直接计算值,表示
1
基础知识
- 数字采用4个字节表示,也就是32位;英文1个字节,中文2-3个字节
- 负数在计算机中是以补码的方式表示的,也就是说
源码 -> 反码 -> 反码 + 1 = 补码
- 负数和正数计算
& | ~
都是从源码开始的,负数得先计算源码
按位非 ~
计算规律总结:数值加1,符号取反,比如 ~10 === -11
, ~-17 === 16