1

今天,我一直在尝试编写一个函数,它应该将给定的 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

不幸的是,我无法弄清楚。我希望有人能帮助我。

编辑:现在,代码在线。对不起,花了一段时间。我与编辑有一些困难。但我只是为了向右旋转而这样做。缺少向左的旋转,因为我没有这样做。

4

3 回答 3

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

gcc -O3 产生:

.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

不完美,但合理。

于 2013-11-07T16:56:50.727 回答
1
int storeBit = *i & one;

@这一行您将一个 64 位无符号整数分配给可能是 4 字节整数。我认为您的问题与此有关。在小端机器中,如果你这样做,事情会很复杂,非定义的操作。

于 2013-11-07T16:50:25.397 回答
0
if(n > 0) 

不取负数

于 2013-11-07T16:52:18.797 回答