雪花算法: https://blog.csdn.net/jiaomubai/article/details/124385324
百度UidGenerator: https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md
美团leaf: https://github.com/Meituan-Dianping/Leaf/blob/master/README_CN.md
butterfly: https://www.yuque.com/simonalong/butterfly/mn26oy
基础知识
正数、负数移位计算
数字在java中以二进制补码的形式存储,移位计算按照补码进行运算。
正数的原码、反码、补码都一样。
负数的补码是:反码 = 原码除第一位符号位外其余取反, 补码 = 反码 + 1。
正数反码计算(以8bit数字为例)
数字 5
原码 = 反码 = 补码 = 0 0000101
负数反码计算(以8bit数字为例)
数字 -5
原码 = 1 0000101
反码 = 1 1111010(原码除第一位符号位外其余取反)
补码 = 1 1111011(反码 + 1)
移位计算符只有3种 << 、 >> 、 >>>
- << 有符号左移,乘法计算,保留第一位符号位,右边补0
- >> 有符号右移,除法计算,正数左边补0,负数左边补1
- >>> 无符号右移,左边补0
正数移位(以8bit数字为例)
数字 5
补码 = 0 0000101
5<<2 = 0 0010100 = 20
5>>2 = 0 0000001 = 1
5>>>2 = 0 0000001 = 1
负数移位(以8bit数字为例)
已知负数补码,求原码方法:反码 = 补码-1, 原码 = 反码除第一位符号位外其余取反
数字 -5
补码 = 1 1111011
-5<<2 = 1 1101100 = -20
-5>>2 = 1 1111110 = -2
-5>>>2 = 0 0111110 = 62