位移位

时间:2011-07-22 17:01:32

标签: c++ bit shift

我只是想知道是否有办法将一个数字“移位”? 我用谷歌搜索了,我找不到任何与我想做的事情有关的事情。 假设我的号码为0b01001101,我想将它向右移动两次“就地”,附加任何从头到尾的数字。所以它看起来像0b01010011。 在c ++中是否有任何函数允许我像这样向左或向右移位?

6 个答案:

答案 0 :(得分:1)

使用汇编指令ror并且每次都要获取进位标志的值。

int rotate(int x, int n)
{
    for(int i = 0; i < n; i++) {
        __asm {
            ror   x, 1            ; rotate and store limit bit in cf
            lahf                  ; get part of flags in ah
            and   ah, 1           ; get only the cf
            shl   eax, 31         ; put it at the end
            and   x, eax          ; and store in x
        }
    }

    return x;
}

答案 1 :(得分:1)

自己写一个,我认为这并不难。

首先存储右边的两位,然后进行位移。最后用存储的位填充左边的两位。

答案 2 :(得分:1)

您想要实施rotational shift

这是一个模板化的版本,应该适用于所有类型的整数(包括短路,字符,整数和无符号/有符号)。

template<class T>
T rotate_shift_right(T x, int shift)
{
    if ((shift > 0) && (shift < (sizeof(x)*8)))
    {
        x = ((unsigned)x >> shift) | (x << (sizeof(x) * 8 - shift));
    }
    return x;
}

template<class T>
T rotate_shift_left(T x, int shift)
{
    if ((shift > 0) && (shift < (sizeof(x)*8)))
    {
        x = (x << shift) | (((unsigned)x) >> (sizeof(x) * 8 - shift));
    }
    return x;
}

答案 3 :(得分:0)

我认为转移它然后将最后一个字节放到开头应该有效。

答案 4 :(得分:0)

不,你应该创建自定义的

答案 5 :(得分:0)

这是作为特定于供应商的扩展实现的。对于MSVC,您可以使用_rotl8, _rotl16(或_rotr*向右旋转)。不确定GCC,但您可以随时放入汇编并使用rolror