将数值n中向左移m位,移动的m位重新出现在右端填补--左旋转移位

大体上可以通过两种方式。

1.通过字符串的方式

2.位运算的方式

//字符串的方式
void move(const char*ps, char * ps1,int n)
{
    strcpy(ps1, &ps[n]); //将指定字符串拷贝至ps1
    if (n == 0) //如果移动0位
        strcpy(ps1,ps);
    strncat(ps1,ps,n); //再将n个字符拷贝至ps1的字符串末端
}
//或者也可以通过两个循环,分两次将一个字符串赋值给另一个字符串数组
//缺点在于,如果需要计算对应的十进制,需要再次转换。
//位运算,出自课本习题的答案:15章,第5题
int new_val(int n, int m)
{
    static const int size = CHAR_BIT * sizeof(unsigned int);
    unsigned int temp;
    m %= size;
    temp = n >> (size - m);     //反向位移,向右移动(size-m)个位,这样就得出将要移动的位的情况
    return (n << m) | temp;     //原先左移,是用0填补,现在用填补的0与temp进行或运算,如果temp的相应位置为1,则打开n的对应位置
}
//可以直接得出新值。

 

posted @ 2022-03-11 20:21  Tolerieren  阅读(59)  评论(0)    收藏  举报