充分利用两个 5 位数字

Making the most out of two 5-digit numbers

不确定这是否是正确的地方,但我相信你们中的一些人能够在以下方面给我一个很好的见解:

考虑 this iBeacon 负载的描述。 据我所知,有一个 UUID 统一了一组信标,'minor' 和 'major' 值区分了该组中的信标。

现在,我想为我的一个应用程序使用 iBeacon 协议。我将不得不使用该 UUID 来唯一标识我的应用程序,只留下 minormajor 值以某种方式唯一标识每个 运行 该应用程序的实例。

MinorMajor 参数都是

(uint16_t)

我刚刚从评论中了解到是一个介于 0 和 65,535 之间的数字。

如何以最佳方式使用这两个号码来创建尽可能多的唯一号码?

非常感谢您的考虑。

这里要理解的关键是 n 二进制 digits/bits 将允许您表示 2^n 不同的数字。一位可以表示两个值(0 或 1)。每增加一位,您之前可以表示的金额就会翻倍。

  • 一位可以表示两个 (2 = 2^1) 个值,0 1,即零到一
  • 两个位可以表示四个 (2*2 = 2^2) 个值,00 01 10 11,即零到三
  • 三位给你八 (2*2*2 = 2^3) 个值,000 001 010 ... 110 111,即零到七
  • 十六位可以表示 2^16 个值,即 0 到 65535

A uint16_t 为您提供 16 位供您使用,因此您可以表示的数字数量固定为 2^16。

两个 uint16_t 会给你 32 位来处理,这让你可以表示 2^32 = 4,294,967,296 = 大约 40 亿个不同的数字。

没有聪明的方法可以将位拼接成更小的块来增加这个数字。如果我将 16 位分成,比方说,10 位部分和 6 位部分,10 位部分会给我 2^10 个数字,6 位部分会给我 2^6 个数字。总的来说,这仍然是 (2^10)*(2^6) = 2^(10+6) = 2^16 个不同的数字。