【问题描述】
假设有一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<cmath>
using namespace std;
int main()
{
int n, x, arr1[20], arr2[20] = { 0 };
cin >> n >> x;
int count = 0;
//1.取二进制数组
while (n)
{
arr1[count] = n % 2;
n = n / 2;
count++;
}
for (int i = count; i < 16; i++)
arr1[i] = 0;
//2.原数组逆序
for (int i = 0; i < 8; i++)
{
swap(arr1[i], arr1[16 - i - 1]);
}
//3.循环右移
while (1)
{
if (x > 16)
x = x - 16;
else
break;
}
for (int i = 0; i < 16; i++)
{
if (i + x < 16)
arr2[i + x] = arr1[i];
else
arr2[i + x - 16] = arr1[i];
}
//4.二进制转十进制
double ans = 0;
for (int i = 0; i < 16; i++)
{
ans += arr2[i] * pow(2, 16 - i - 1);
}
cout << ans;
return 0;
}