我可以像这样将一个单词左右旋转一定的Angular :
#define ROR(x, r) ((x >> r) | (x << (64 - r)))
#define ROL(x, r) ((x << r) | (x >> (64 - r)))
[...]
ROR(var1, 11);
ROL(var1, 11);
我怎么能做同样的事情,但对一个完整的字节数组(我的意思是:数组序列中的所有位)?一个如下的数组:
uint32_t somearray[12] = {
0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96,
0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
};
PS:有一个similar question here,但我需要知道如何做一些数额。
2条答案
按热度按时间lsmepo6l1#
ROR
和ROL
宏有两个问题:x
是uint64_t
。uint64_t
移位64位具有未定义的行为。如果r
的移位数可以为空,则应修改表达式以避免移位64位。以下是修改后的版本:
请注意,建议使用内联函数而不是宏,以避免操作数产生副作用并强制操作数大小的问题:
要旋转一个完整的单词数组,使用不同的数组作为源和目标并编写一个循环会更简单:
下面是一个测试程序:
rta7y2nd2#
要循环移位 array 中的所有位,请创建一个函数,该函数接受大小、指向数据的指针和移位量。
对于一个32位值的数组,由于字节序的原因,数组的位移位在算术上可能与
some_32_bit >> sh
相同。更高级的_Generic
求解宏的使用解决了这个问题。