Chunking Arithmetics

时间:2013-12-25 02:51:39

标签: theory organization

考虑两个坐标系,一个用于对象本身,一个用于包含对象的块。让我们考虑块大小为4,这意味着坐标0处的对象位于块0中,坐标3处的对象是同样在块0中,但是坐标8处的对象在块2中,坐标-4处的对象在块-1中。

计算具有正位置的对象的块数很容易:object.number/chunk_size

但是我没有找到一个公式来计算负位置对象的正确块位置:

-4/4 = -1是正确的,但-2/4 = 0不是必需的结果,但-4/4 -1 = -2现在不正确,但-2/4 -1 = -1现在正确...

计算每个职位是否有一个甜蜜,简短的方法,或者我需要检查两个条件:

chunkx = objectx > 0 ?
    objectx / chunksize :
    objectx % chunksize == 0 ?
        objectx / chunksize :
        objectx / chunksize - 1;

替代:

chunkx = objectx > 0 || objectx % chunksize == 0 ?
    objectx / chunksize :
    objectx / chunksize -1;

注意:计算块中对象的位置是:

internalx = objectx - chunkx * chunksize

对于正面和负面(-4 - > 0; -2 - > 2; 1 - > 1; 4 - > 0)

有没有更优雅的方式来计算这个我公然监督这里?

2 个答案:

答案 0 :(得分:1)

如果你能负担得起将数字转换为浮点并具有廉价的楼层功能,你可以使用floor(-1.0 / 4.0)来获得-1,但是转换到浮点可能比分支。

另一种选择是只使用一个足够大的数字(块大小的倍数)到对象坐标,并从块块坐标中减去该块除以块大小来处理正数。这可能比分支便宜。

对于你的第二个问题,如果你的块大小恰好是2的幂,你可以使用二进制和(-1&(chunksize-1)== 3)

答案 1 :(得分:0)

如果你的块大小是2的幂,你可以这样做:

chunkx = (objectx & ~(chunksize - 1)) / chunksize;

如果块大小也是常量,编译器可能会把它变成一个简单的AND和shift。如,

chunkx = (objectx & 3) >> 2;

对于一般情况,我认为你不能消除分支,但是你可以通过在分割之前抵消数字来消除慢模运算:

chunkx = ((objectx >= 0) ? (objectx) : (objectx - (chunksize - 1))) / chunksize;