我试图使用<<<<<<<<<<<<<<<<<<<<和>>运营商但结果并没有像预期的那样出现......
它适用于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位机器上做这个...也许它与那个有关...
非常感谢;)
答案 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)
您应该始终使用索引变量进行索引,并将移位计数移位。然后事情可能会成功。