使用 GCC 组件向左/向右旋转移动次数

Posted

技术标签:

【中文标题】使用 GCC 组件向左/向右旋转移动次数【英文标题】:Rotate left/right with number of moves using GCC assembly 【发布时间】:2013-11-21 00:20:51 【问题描述】:

我有以下代码来计算 Visual Studio 程序集中的左/右旋转。

template<class T>
inline T rotr(T x, unsigned char moves)
    unsigned char temp;
    __asm
        mov temp, CL
            mov CL, moves
            ror x, CL
            mov CL, temp
    ;
    return x;

template<class T>
inline T rotl(T x, unsigned char moves)
    unsigned char temp;
    __asm
        mov temp, CL
            mov CL, moves
            rol x, CL
            mov CL, temp
    ;
    return x;

1- 我们如何为 gcc 编写等效的 asm 代码。

2- 有没有更好的方法在 Visual Studio 程序集中编写它?

【问题讨论】:

VC++ 在标准库中有_rotl/_rotr(对于ints)和_rotl64/_rotr64对于long long)。 同理,gcc(gas)x86 程序集有 rol/ror(旋转且不包含进位)和 rcl/rcr(旋转包含进位)。 【参考方案1】:

我在这里找到了答案:

Poor _rotl performance under minGW

并将我的代码重写为:

template<class T> 
inline  T rotr(T x, uint8_t r) 
      asm("rorl %1,%0" : "+r" (x) : "c" (r));
      return x;
    

template<class T> 
inline  T rotl(T x, uint8_t r) 
      asm("roll %1,%0" : "+r" (x) : "c" (r));
      return x;
    

感谢 Jerry Coffin 和 gnometorule 提供的关于 _rotl/_rotr _rotl64/_rotr64 的有用 cmets

【讨论】:

以上是关于使用 GCC 组件向左/向右旋转移动次数的主要内容,如果未能解决你的问题,请参考以下文章

php 用于向左和向右旋转数组元素的功能

Vim指令

css 向左向下箭头

vim常用快捷汇总

OpenGL:相机和对象

[bzoj]2131: 免费的馅饼