我tyring創建稀疏八叉樹實現像在nVidia的("Efficient Sparse Voxel Octrees")的人設位位置正在做他們的體素的東西,當我碰到這個問題:找到一個字節
我有型字節的位字段(所以只有8位)告訴我八叉樹的葉子在哪裏(1表示葉子,0表示沒有葉子,8個節點連接 - > 8位)。我現在想要做的是返回一個葉子位置的數組。我目前的實現是使用while循環來查明LSB是否被設置。之後輸入被移位1。因此,這裏是我該怎麼辦:
int leafposition = _leafmask & _validmask;
int[] result = new int[8];
int arrayPosition = 0;
int iteration = 0;
while (leafposition > 0)
{
iteration++; //nodes are not zero-indexed ... ?
if ((leafposition & 1) == 1) // LSB set?
{
result.SetValue(iteration, arrayPosition);
arrayPosition++;
};
leafposition = leafposition >> 1;
}
return result;
這不是找優雅,有兩件事情是令人不安:
- 這個while循環模仿一個for循環
- 結果數組將最有可能小於8的值,但調整大小的代價是昂貴的
我期望的結果就像[2,4,6]
爲42 (0010 1010)
。
任何人都可以提供一個更優雅的解決方案,仍然可讀嗎?
結果
我使用的八叉樹葉數我先前實施到陣列設定爲適當的大小的功能。
這是不是真的那麼慢重新分配的數組。對於你的目的而言,它是否太慢是另一回事(因爲這大概是經常調用的內循環代碼)。您可能首先考慮計算漢明權重(位數設置爲1),以便可以分配適當大小的數組,並測量兩種方法。 http://stackoverflow.com/questions/109023/how-to-count-the-number-of-set-bits-in-a-32-bit-integer –
你知道,這就是爲什麼我在這裏問。我寫的最後一個方法就是儘可能快地獲得葉數......不能相信我這樣做時並沒有考慮自己的代碼。非常感謝你的最明顯的想法! – HaMster