Программистское
Есть ли более эффективный способ транспонировать 64-битную матрицу,
представленную в виде длинного-длинного целого, чем
представленную в виде длинного-длинного целого, чем
unsigned long long
transpose (unsigned long long arg)
{
unsigned long long res = 0;
// Bits 0 stays in place, bit 1 goes to bit 8, 2 to 16 etc.,
// that is the shift amount is a multiple of 7. Bit spreading
// is done by multiplying a 7 bit value by a constant with 1 bits
// set every 7 positions, and masking.
int i;
for (i = 0; i < 8; i++)
{
unsigned low1 = arg & 1;
unsigned low7 = arg & 0xfe;
res |= ((low7 * 0x2040810204080LL) & 0x101010101010100LL | low1) << i;
arg >>= 8;
}
return res;
}