今天,我一直试图写一个函数,如果n为负,它应该向右旋转给定的64位整数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
不幸的是,我无法理解。我希望有人可以帮助我。
编辑:现在,代码在线。 Sry,花了一段时间。我对编辑有些困难。但我只是为了向右旋转而做到了。缺少向左旋转,因为我没有这样做。
答案 0 :(得分: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
不完美,但合理。
答案 1 :(得分:1)
int storeBit = *i & one;
@此行您将64位无符号整数分配给大概4字节的整数。我认为你的问题与此有关。在小端机器中,如果你做了非定义的操作,事情会很复杂。
答案 2 :(得分:0)
if(n > 0)
不需要否定n