Есть такая замечательная штука как Z-кривая Мортона, очень удобна для всяких рекурсий и многомерных массивов с хорошей локальностью данных.
Нужно зная сдвиг ячейки от начала D-мерного массива найти сдвиг ее ближайшего соседа по диагонали (вперед-вверх).
Я знаю только такое решение
const uint64_t zmasks[16]={
0xffffffffffffffff, 0x5555555555555555, 0x9249249249249249, 0x1111111111111111,
0x1084210842108421, 0x1041041041041041, 0x8102040810204081, 0x0101010101010101,
0x8040201008040201, 0x1004010040100401, 0x0080100200400801, 0x1001001001001001,
0x0010008004002001, 0x0100040010004001, 0x1000200040008001, 0x0001000100010001
};
template <int D, typename T> T zoff_diag_shift(T offset){
for(int i=0; i<D; i++){
T omask = zmasks[D-1]<<i, imask = ~omask, fix = offset&imask;
offset = (((offset|imask)+1)&omask)|fix;
}
return offset;
}
т.е. берем и тупо двигаем последовательно на единичку по каждой из координат. Может кто то может предложить более эффективный вариант с меньшим числом операций, ситуация то выделенная?