Math 使用(x,y)余字和位操作高效访问非线性填充的一维阵列

Math 使用(x,y)余字和位操作高效访问非线性填充的一维阵列,math,bit-manipulation,Math,Bit Manipulation,我正在制作一个四叉树来保存一个大正方形网格的值。网格的许多区域都用相同的值填充,因此我没有在许多节点中保留相同的值,而是保留一个节点,告诉函数在该区域的任何位置查找值,该值就是节点所保留的值。当很多节点在一起非常不同时,我将它们放在一个节点中,该节点包含这些值的数组,以减少有许多中间人节点的开销 为了简单起见,我将使用字节大小的示例,但我的网格要大得多。256个值的16x16网格可能如下所示: [ root ] <----16x16 / | | \

我正在制作一个四叉树来保存一个大正方形网格的值。网格的许多区域都用相同的值填充,因此我没有在许多节点中保留相同的值,而是保留一个节点,告诉函数在该区域的任何位置查找值,该值就是节点所保留的值。当很多节点在一起非常不同时,我将它们放在一个节点中,该节点包含这些值的数组,以减少有许多中间人节点的开销

为了简单起见,我将使用字节大小的示例,但我的网格要大得多。256个值的16x16网格可能如下所示:

       [ root ]     <----16x16
       / |  |  \
      / [1][1] [64] <-+--8x8
  [  node  ]        <-+
   / |  |  \
  /[16][16][16]     <-+--4x4 
[  node  ]          <-+
 |  |  |  \
[1][1][1] [4]       <----2x2
下面是将一维数组的索引打印到二维网格上时的效果

   0  1  2  3  4  5  6
0 | 0| 1| 4| 5|16|17|20|
1 | 2| 3| 6| 7|18|19|
2 | 8| 9|12|13|
3 |10|11|14|15|
4 |32|33|
5 |34|35|
6 |40|            etc.
当然,现在我有了一个切割网格的解决方案,我只是让从中检索任何东西变得很烦人。下面是我目前如何从(x,y)坐标系中获取一维数组的索引

这很有效,但很痛苦。。。当我在写完之后思考它时,我突然意识到我是在高水平上操作位的。因此,理论上可以直接查看(x,y)的位来确定数组的索引位,而无需做很多工作

我一直试图通过同时查看x、y和索引二进制来解决我在二进制中需要做什么,但是我没有任何机会推导出一个超出“如果x以1结尾,则索引是奇数”的方法


我确信xy值可以告诉我指数在哪个象限,x表示东或西,y表示北或南。我想我可能需要做一个面具什么的,idk,我从来没有直接在大学外处理过比特,嗯,除了比特旗。因此,如果有人能帮我做些什么,我可以得到索引,这将是一个巨大的帮助

奇怪的问题。也许莫顿订单能帮上忙?与其做addr=x+y*w,不如做addr=bit0(x)| bit0(y)这正是我要找的!非常感谢!奇怪的问题。也许莫顿订单能帮上忙?与其做addr=x+y*w,不如做addr=bit0(x)| bit0(y)这正是我要找的!非常感谢!奇怪的问题。也许莫顿订单能帮上忙?与其做addr=x+y*w,不如做addr=bit0(x)| bit0(y)这正是我要找的!非常感谢!
   0  1  2  3  4  5  6
0 | 0| 1| 4| 5|16|17|20|
1 | 2| 3| 6| 7|18|19|
2 | 8| 9|12|13|
3 |10|11|14|15|
4 |32|33|
5 |34|35|
6 |40|            etc.
uint index( uint x, uint y ){
    uint l = sqrt(array.length);
    uint index;
    uint chunk = array.length;
    while ( l > 1 ){
        l /= 2;
        chunk /= 2;
        if( y >= l ){
            y -= l;
            index += chunk;
        }
        chunk /= 2;
        if( x >= l ){
            x -= l;
            index += chunk;
        }
    }
    return index;
}
          N7 N6 N5 N4 N3 N2 N1 N0
  x   5  |--|--|--|--|00|00|01|01| 
  y   1  |--|--|--|--|00|00|00|01| 
Index 17 |00|00|00|00|00|01|00|01|
          N7 N6 N5 N4 N3 N2 N1 N0
  x   1  |--|--|--|--|00|00|00|01|
  y   6  |--|--|--|--|00|00|01|10|
Index 41 |00|00|00|00|01|00|10|01|