二进制位运算的魔力
本文仅用来收集一些二进制位运算的小技巧
简介
关于原码、反码、补码
- 原码:符号位+数值位
- 反码:符号位不变,数值位取反
- 补码:反码+1
关于数的存储方式
- 正数的存储为:原码
- 负数的存储为:补码
a & -a
a & -a
的结果是 a 的二进制表示中最低位的 1 所在位的值
1 | 56 & -56 |
a & (2^n - 1)
当对一个数 a
求模 2^n
时,可以使用 a & (2^n - 1)
来代替 a % 2^n
,其中 n
为正整数
1 | 100 mod 16 |
bitmap
bitmap 是一种数据结构,用来表示一个很大的整数集合,每个整数的出现与否用一个二进制位来表示,这种数据结构可以非常节省内存空间
例如:记录当日登录用户数,假设总共用户数为 1000 万,那么需要 1000 万个二进制位,即 1250000 字节,约 1.2M,最后统计时,只需要遍历一遍二进制位,将二进制位为 1 的个数加起来即可得到当日登录用户数