我需要将两位(标签)存储在一个双数字中。我愿意从这些数字中删除一些额外的精度。我知道在对它们进行实际算术之前,我需要用0或1填充这两个额外的位。基本上我需要像#34; tagged pointer / double"这样的东西,所以我可以在x64平台上的同一个64位位置存储一个指针和一个double,并根据标签在它们之间进行选择。一点就足够了,但我有时需要存储其他东西。
我知道对于指针它非常简单,只需将它们对齐以使最低有效位始终为零,将数据存储在那里并在解除引用之前清除。或者您可以使用前16位,但在解除引用之前将它们全部清除为0(或全部为1)。在uint64
中存储额外数据也非常简单,只需使用最重要的位,在使用前清除。当然,你放松了一半的整数范围。但是对于双打......它们分为三个部分:符号,指数和分数(见图片,由维基百科提供)。双精度中哪两个不太重要(精确度)位,您可以丢弃以将标记存储在其中?指数的最不重要的部分?分数的高位?我愿意在使用号码之前进行清算/转移。