сегодня я пытался написать функцию, которая должна вращать данное 64-битное целое число на n бит вправо, но также и влево, если n отрицательно. Конечно, биты из целого числа должны быть заменены на другой стороне.
Я сохранил функцию довольно простой.
void rotate(uint64_t *i, int n)
uint64_t one = 1;
if(n > 0) {
do {
int storeBit = *i & one;
*i = *i >> 1;
if(storeBit == 1)
*i |= 0x80000000000000;
n--;
}while(n>0);
}
}
возможные входы:
uint64_t num = 0x2;
rotate(&num, 1); // num should be 0x1
rotate(&num, -1); // num should be 0x2, again
rotate(&num, 62); // num should 0x8
К сожалению, я не мог понять это. Я надеялся, что кто-нибудь сможет мне помочь.
РЕДАКТИРОВАТЬ: Теперь код онлайн. Сорри, это заняло некоторое время. У меня были некоторые трудности с редактором. Но я просто сделал это для вращения вправо. Поворот влево отсутствует, потому что я его не делал.
rotate()
где-то еще? Объявление функции на самом деле не означает, что что-то произойдет, если оно где-то не реализовано. - person jonhopkins   schedule 07.11.2013rotate
, чтобы помочь, и указание на то, какие части неясны, также поможет. Предпочтительно SSCCE, то есть с заголовками, main и т. д. - person Shafik Yaghmour   schedule 07.11.2013rotate()
. Тот, который не работает. - person glglgl   schedule 07.11.2013void rotate(uint64_t *i, int n);
. Итак, я предполагал, что у вас есть фактическая реализация,void rotate(uint64_t *i, int n) { // your code }
где-то еще в вашем файле. - person jonhopkins   schedule 07.11.2013rotate
. - person Raymond Chen   schedule 07.11.20130x80000000000000
, выглядит немного коротким. Я почти уверен, что если вы добавите еще два 0 в конец, он должен начать работать правильно. - person jonhopkins   schedule 07.11.2013if (x) { do { ...} while (x); }
лучше писать какwhile (x) { ... }
. - person glglgl   schedule 08.11.2013