Morton码的计算

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: Morton码是对栅格格网进行编码的一种算法,在Google中搜索Morton,搜索结果第一位是Wikipedia的Z-order Curve,这是因为Morton码编码结果展现为一种Z形的填充曲线。下面简要说一下如何计算四进制和十进制的Morton码。

Morton码的计算

Morton码是对栅格格网进行编码的一种算法,在Google中搜索Morton,搜索结果第一位是Wikipedia的Z-order Curve,这是因为Morton码编码结果展现为一种Z形的填充曲线。下面简要说一下如何计算四进制和十进制的Morton码。

截屏2023-09-08 15.53.12.png

四进制Morton码计算

四进制编码对左上,右上,左下,右下的顺序对四个格网单元分布编码为0,1,2,3。

其计算方式为:二进制的行列号$r$、$l$(从第0行0列开始),四进制编码$M=2*l+ r$;那么这里就是:第5行(101)第7列(111):$M=2*101+111=313$(313对应的十进制是55)

十进制Morton码计算

十进制的编码规则:首先,行列号转为二进制(从第0行0列开始);然后行列号交叉排列;最后将二进制结果转为十进制。十进制Morton编码是按左上,右上,左下,右下的顺序从0开始对每个格网进行自然编码的。

对于第5行(101)第7列(111),交叉排列得到110111,然后转为十进制就是55。和四进制的编码结果是一样的。

下面给出十进制Morton码的C++实现:

#include <iostream>

using std::cout;

int main() {
    uint32_t row = 5;
    uint32_t col = 7;
    uint64_t morton = 0;

    for (int i = 0; i < sizeof(row) * 8; i++) {
        morton |= (row & (uint64_t)1 << i) << i | (col & (uint64_t)1 << i) << (i + 1);
    }
    cout << morton << '\n';
    return 0;
}
目录
相关文章
|
4月前
|
存储 人工智能 算法
每日练习——同余方程以及格雷码
每日练习——同余方程以及格雷码
28 1
|
4月前
余三码和8421码的关系以及使用场景
余三码与8421码是两种不同的二进制编码方式,常用于表示十进制数。余三码是8421码加上3形成的无权码,具有自补性和进位信号特点,适合错误检测,但求和需修正。8421码是恒权码,方便二进制与十进制转换,常用于数字显示、数据传输和精确十进制运算。在计算机领域,两者各有应用场景,如BCD码用于七段显示器和精确计算,余三码则用于错误检测和简化算术操作逻辑设计。
|
5月前
|
缓存 NoSQL Java
你的码有我的码蠢?
你的码有我的码蠢?
41 0
|
12月前
CRC循环冗余码计算
CRC循环冗余码计算
117 0
|
Web App开发 编解码 数据建模
FOURCC四字符码对照表
FOURCC四字符码对照表
148 0
|
存储
系统码的编译码与汉明码
系统码的编译码与汉明码
125 0
系统码的编译码与汉明码
BCH码与RS码详解
BCH码与RS码详解
250 0
打印跳4、7的流水码数据
做防伪的朋友经常遇见有些客户比较忌讳4和7在流水号中出现,希望打印流水号的时候跳过去,Label mx 条码软件提供了流水“自定义进制”的功能, 可以完美实现。当然,利用“自定义进制”可以实现任一数字或字母的跳码。
120 0
|
存储 网络协议 网络安全
计算机网络,CRC码计算生成
网络协议概念:网络协议是计算机网络相互通信的对等层实体之间交换信息时必须遵守的规则或约定的集合。[网络协议是网络上所有设备(网络服务器、计算机及交换机、路由器、防火墙等)之间通信规则的集合,它规定了通信时信息必须采用的格式。TCP/IP协议、IPX/SPX协议。网络协议的三个基本要素:语法、语义和同步;语法:数据和控制信息的结构或格式②语义:用于协调和进行差错处理的控制信息③时序(同步):是对事件实现顺序的详细说明
192 1
计算机网络,CRC码计算生成