C中是否有旋转操作

时间:2016-05-02 15:36:00

标签: c assembly bitwise-operators

从装配书中:

  

适用于位串的另一组逻辑运算是shift和rotate   操作。这两个类别可以进一步细分为左移,左转,   右移,右转。这些操作对装配非常有用   语言程序员。

  

另一对有用的操作是向左旋转并向右旋转。这些操作   表现就像左移和右移操作有一个主要区别:位   从一端向外移出,在另一端向后移动。

他们在C中的旋转操作是否等同于汇编中的rotate操作?

2 个答案:

答案 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的值生成不正确的结果。

感谢JesterOlaf关于改进和概括n位移n位的想法。

答案 1 :(得分:2)

除了另一个答案之外:Microsoft编译器具有生成CPU级旋转指令的内在函数:_rotl16_rotr16等。这些指令自然是CPU依赖的。

GCC的最新版本也有_rotr_rotl