user2965601
user2965601

Reputation:

C - Rotate a 64 bit unsigned integer

today, I have been trying to write a function, which should rotate a given 64 bit integer n bits to the right, but also to the left, if the n is negative. Of course, bits out of the integer shall be rotated in on the other side.

I have kept the function quite simple.

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);
   }
 }

possible inputs are:

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

Unfortunately, I could not figure it out. I was hoping someone could help me.

EDIT: Now, the code is online. Sry, it took a while. I had some difficulties with the editor. But I just did it for the rotation to the right. The rotation to the left is missing, because I did not do it.

Upvotes: 1

Views: 2293

Answers (3)

Chris Dodd
Chris Dodd

Reputation: 126110

uint64_t rotate(uint64_t v, int n) {
    n = n & 63U;
    if (n)
        v = (v >> n) | (v << (64-n));
    return v; }

gcc -O3 produces:

.cfi_startproc
andl    $63, %esi
movq    %rdi, %rdx
movq    %rdi, %rax
movl    %esi, %ecx
rorq    %cl, %rdx
testl   %esi, %esi
cmovne  %rdx, %rax
ret
.cfi_endproc

not perfect, but reasonable.

Upvotes: 2

Luka Rahne
Luka Rahne

Reputation: 10447

if(n > 0) 

doesnt takes negative n

Upvotes: 0

cycrel
cycrel

Reputation: 97

int storeBit = *i & one;

@This line you are assigning an 64 bit unsigned integer to probably 4 byte integer. I think your problem is related to this. In little endian machines things will be complicated if you do, non-defined operations.

Upvotes: 1

Related Questions