自增序号算法

雪花算法: 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


发表评论 / Comment

用心评论~