0
我想將由兩個雙值(x,y)表示的座標對轉換爲希爾伯特值。我發現下面的實現(from this link):如何從雙座標計算希爾伯特指數?
/*****************************************************************
* hilbert_c2i
*
* Convert coordinates of a point on a Hilbert curve to its index.
* Inputs:
* nDims: Number of coordinates.
* nBits: Number of bits/coordinate.
* coord: Array of n nBits-bit coordinates.
* Outputs:
* index: Output index value. nDims*nBits bits.
* Assumptions:
* nDims*nBits <= (sizeof bitmask_t) * (bits_per_byte)
*/
bitmask_t
hilbert_c2i(unsigned nDims, unsigned nBits, bitmask_t const coord[])
{
if (nDims > 1)
{
unsigned const nDimsBits = nDims*nBits;
bitmask_t index;
unsigned d;
bitmask_t coords = 0;
for (d = nDims; d--;)
{
coords <<= nBits;
coords |= coord[d];
}
if (nBits > 1)
{
halfmask_t const ndOnes = ones(halfmask_t,nDims);
halfmask_t const nd1Ones= ndOnes >> 1; /* for adjust_rotation */
unsigned b = nDimsBits;
unsigned rotation = 0;
halfmask_t flipBit = 0;
bitmask_t const nthbits = ones(bitmask_t,nDimsBits)/ndOnes;
coords = bitTranspose(nDims, nBits, coords);
coords ^= coords >> nDims;
index = 0;
do
{
halfmask_t bits = (coords >> (b-=nDims)) & ndOnes;
bits = rotateRight(flipBit^bits, rotation, nDims);
index <<= nDims;
index |= bits;
flipBit = (halfmask_t)1 << rotation;
adjust_rotation(rotation,nDims,bits);
} while (b);
index ^= nthbits >> 1;
}
else
index = coords;
for (d = 1; d < nDimsBits; d *= 2)
index ^= index >> d;
return index;
}
else
return coord[0];
}
然而,這是一個整數值作爲輸入。如何適應我的雙重價值?
如果體系結構使用'double'的[IEEE 754 Binary64](https://en.wikipedia.org/wiki/IEEE_floating_point#Basic_and_interchange_formats)類型,並且'double'的字節順序與' uint64_t'整型, - 例如,這種情況就是這種情況x86-64體系結構(64位Intel/AMD) - ,並且所有的double都有一個有限的值,那麼你可以將'double'的存儲複製到'uint64_t'中,然後減去2⁶3= 9,223,372,036,854,775,808,並將結果用作無符號的64位整數。該映射保留所有有限值的順序,並且是可逆的(返回到「double」)。 –
@NominalAnimal謝謝你的建議。因此,我會做這個建議的轉換,並調用函數沒有任何改變?我的雙重價值觀也可能是負面的。另外,我也需要獲得雙倍的回報。 –