从装配书中:
适用于位串的另一组逻辑运算是shift和rotate 操作。这两个类别可以进一步细分为左移,左转, 右移,右转。这些操作对装配非常有用 语言程序员。
和
另一对有用的操作是向左旋转并向右旋转。这些操作 表现就像左移和右移操作有一个主要区别:位 从一端向外移出,在另一端向后移动。
他们在C中的旋转操作是否等同于汇编中的rotate
操作?
答案 0 :(得分:6)
虽然C没有配对轮换位移的对应部分,但你可以自己实现它们,方法是将原始数字的最高/最低位与常规移位的结果进行或运算。
以下是无符号32位整数的示例:
uint32_t val = ... // This is the value being rotated
uint32_t rol = (val << 1) | (val >> 31);
uint32_t ror = (val >> 1) | (val << 31);
您可以将其概括为按任意位数旋转,如下所示:
uint32_t val = ... // This is the value being rotated
uint32_t n = ...
n &= 31; // Force n into the range of 0..31, inclusive
uint32_t rol = (val << n) | (val >> (-n & 31));
uint32_t ror = (val >> n) | (val << (-n & 31));
使用unsigned
类型非常重要,因为否则右移会对值进行符号扩展,从而为符号位设置为1
的值生成不正确的结果。
答案 1 :(得分:2)
除了另一个答案之外:Microsoft编译器具有生成CPU级旋转指令的内在函数:_rotl16
,_rotr16
等。这些指令自然是CPU依赖的。
GCC的最新版本也有_rotr
,_rotl
。