C循环移位64位不能正常工作

时间:2014-03-31 15:17:03

标签: c 64-bit bit-manipulation bit-shift shift

我试图使用<<<<<<<<<<<<<<<<<<<<和>>运营商但结果并没有像预期的那样出现......

它适用于1但不是更多的循环移位(我还没有验证所有这些)...

uint64_t array[25];
for(i=0;...)
   array[i] = ((s[n] << n) | (s[i] >> (64-n)));

实施例:     ---&GT;试图改变这一点:00:00:02:26:00:00:00:2D     ---&GT;我得到了这个:00:80:80:09:00:00:40:0B

这没有任何意义,因为我甚至无法理解发生的事情。

任何帮助将不胜感激。我试图在32位机器上做这个...也许它与那个有关...

非常感谢;)

3 个答案:

答案 0 :(得分:2)

使用s [i]而不是s [n]:

uint64_t array[25];
for(i=0;...)
   array[i] = ((s[i] << n) | (s[i] >> (64-n)));

您正在将索引变量i和移位范围n混合在一起,这在这种情况下毫无意义。我假设s是:

uint64_t s[25];

不,这不是架构问题... uint64_t是x86和ia64系列中的无符号64位整数。在后面的64位整数由CPU本地处理,在前者你必须使用更多的寄存器来做同样的事情......

答案 1 :(得分:0)

确保*s的类型无符号,否则您将获得符号扩展位移。

此外,您还有s[n] << n而不是s[i] << n

另外,如果您使用的是x86-64,则可能需要考虑使用处理器指令:

uint64_t temp = s[i];
asm ("rolq %0, %%cl"
     , "+r" (temp)
     : "c" ((uint8_t)n));
array[i] = temp;

答案 2 :(得分:0)

您应该始终使用索引变量进行索引,并将移位计数移位。然后事情可能会成功。