Ну, нормальное вращение может быть реализовано так:
unsigned int rotate(unsigned int bits, unsigned int n) {
return bits << n | (bits >> (32 - n));
}
Итак, вот предположение о 64-битной реализации с 32-битными переменными:
void bit_rotate_left_64(unsigned int hi, unsigned int lo, unsigned int n,
unsigned int *out_hi, unsigned int *out_lo) {
unsigned int hi_shift, hi_rotated;
unsigned int lo_shift, lo_rotated;
hi_shift = hi << n;
hi_rotated = hi >> (32 - n);
lo_shift = lo << n;
lo_rotated = lo >> (32 - n);
*out_hi = hi_shift | lo_rotated;
*out_lo = lo_shift | hi_rotated;
}
По сути, я просто беру повернутые биты из старшего слова и делаю их с младшим словом, и наоборот.
Вот быстрый тест:
int main(int argc, char *argv[]) {
/* watch the one move left */
hi = 0;
lo = 1;
for (i = 0; i < 129; i++) {
bit_rotate_left_64(hi, lo, 1, &hi, &lo);
printf("Result: %.8x %.8x\n", hi, lo);
}
/* same as above, but the 0 moves left */
hi = -1U;
lo = 0xFFFFFFFF ^ 1;
for (i = 0; i < 129; i++) {
bit_rotate_left_64(hi, lo, 1, &hi, &lo);
printf("Result: %.8x %.8x\n", hi, lo);
}
}