题意:
        有一个二进制数的字符串,把字符串循环右移k位,然后得到一个新的二进制数,求这个数的十进制值是多少。
        给定一个二进制字符串str和循环位移位数k,返回循环后的二进制数的十进制值。


方法一: 
剪切模拟
思路:
        将低k位二进制串和高(n-k)位二进制串拼接成新串,然后再计算新串二进制数的十进制值。



class Solution {
public:

    long long rotateRight(string str, int k) {
        int n=str.size();
        string res=str.substr(n-k)+str.substr(0,n-k);//得到新的字符串

        long long sum=0,x=1;
        for(int i=n-1;i>=0;i--){//从后往前遍历
         
            if(res[i]=='1'){//如果是‘1’,则加上该位的权重
                sum+=x;
            }
            x<<=1;//计算权重
           
        }
        return sum;
    }
};


时间复杂度:,n为字符串长度 
空间复杂度:,n为存储新字符串的长度空间

方法二: 直接模拟

思路:
直接模拟,不需要组建新串,先计算后k位,再计算前n-k位。 
注意点:(sum<<1),右移要加括号。

class Solution {
public:

    long long rotateRight(string str, int k) {
        int n=str.size();

        long long sum=0;
        for(int i=n-k;i<n;i++){//先计算后k位
            sum=(sum<<1)+str[i]-'0';
        }
        for(int i=0;i<n-k;i++){//再计算前n-k位
            sum=(sum<<1)+str[i]-'0';
        }
        return sum;
    }
};


时间复杂度:,n为字符串长度 
空间复杂度:,n为存储新字符串的长度空间