【问题描述】
假设有一16位的无符号整数,可以对其二进制数据进行循环右移操作,右移后仍然是无符号整数。编写程序从控制台读入要右移的整数和循环右移的位数,求得并输出循环右移后的十进制数据。
【输入形式】
从控制台输入要右移的十进制整数(大于等于0,小于等于65535)和循环右移的位数(大于等于0,小于等于16),两整数之间用一个空格分隔。
【输出形式】
向控制台输出循环右移后的十进制整数。
【输入样例1】
65532 2
【输出样例1】
16383
【样例1说明】
输入的待右移的整数为65532,该无符号整数的二进制形式为:1111111111111100,向右循环右移两位后的二进制形式为:0011111111111111,对应的十进制数据为:16383。
【输入样例2】
6 3
【输出样例2】
49152
【样例2说明】
输入的待右移的整数为6,该无符号整数的二进制形式为:0000000000000110,向右循环右移3位后的二进制形式为:1100000000000000,对应的十进制数据为:49152。
代码如下:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<istream>
#include<iomanip>
#include<ostream>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<fstream>
#include<stack>
#include<ctime>
#include<deque>
#include<queue>
#pragma warning (disable:4996)
using namespace std;
int s[16];
int main()
{
int n;
int m;
cin >> n >> m;
m %= 16;
int index = 0;
while (n != 0) {
s[index++] = n % 2;
n /= 2;
}//转换为二进制(反)
int sum = 0;
int t = 1;
for (int i = m; i < 16; i++) {
sum = sum + t * s[i];
t = t * 2;
}//按权展开1
for (int i = 0; i < m; i++) {
sum = sum + t * s[i];
t = t * 2;
}//按权展开2
cout << sum;
return 0;
}