Мне нужно реализовать функцию, которая поворачивает влево последние 10 битов int.
Итак, если int имеет значение
0b 1111 0000 0000 0000 0000 1100 1100 0000
левое вращение на 2 дало бы нам
0b 1111 0000 0000 0000 0000 1111 0000 0000
Дальнейшее левое вращение на 1 дало бы
0b 1111 0000 0000 0000 0000 1110 0000 0001
ptr
- указатель на данный int, который мы хотим повернутьn
- сколько раз мы хотим повернуть
void leftRotateLast10Digits(int * ptr, int n) {
}
Я понимаю, как это сделать, если мы хотим повернуть весь int, но я не уверен, как это сделать только для последних 10 цифр. Я думаю, что если повернуть int влево, это будет выглядеть примерно так, как показано ниже. Но все же я не понимаю, как повернуть только последние 10 цифр.
void leftRotate(int * ptr, int n) {
int DROPPED_MSB;
int INT_BITS = sizeof(int) * 8 - 1;
int num = *ptr;
// The effective rotation
n %= INT_BITS;
while(n) {
DROPPED_MSB = (num >> INT_BITS) & 1;
// Left rotate num by 1 and set its dropped MSB as new LSB
num = (num << 1) | DROPPED_MSB;
n--;
}
*ptr = num;
}
int INT_BITS = sizeof(int) * 8 - 1;
, похоже, создает общую функцию, работающую для каждой архитектуры. Это требование? Будет ли приемлемо предположение о 4-байтовом целом? - person Roberto Caboni   schedule 09.07.2020n > 9
, дляn < 0
? - person chux - Reinstate Monica   schedule 10.07.2020int INT_BITS = sizeof(int) * 8 - 1; n %= INT_BITS;
сомнительный код. Я ожидаю, чтоn %= INT_BITS + 1;
и другие справятся сn < 0
. - person chux - Reinstate Monica   schedule 10.07.2020