循环右移
Posted woxiaosade
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了循环右移相关的知识,希望对你有一定的参考价值。
【问题描述】
假设有一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。
【评分标准】
该题要求编程求得循环右移后的数据,提交程序文件名为shift.c。
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <vector> #include <stdlib.h> #include <cstdlib> #include <string.h> #include <string> #include <cmath> #include <map> #include <time.h> 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; //cout << s[index - 1]; n /= 2; } int sum = 0; int t = 1; for (int i = m; i < 16; i++) { //cout << t << " " << s[i] << endl; sum = sum + t * s[i]; t = t * 2; } for (int i = 0; i < m; i++) { //cout << t; sum = sum + t * s[i]; t = t * 2; } cout << sum; return 0; }
以上是关于循环右移的主要内容,如果未能解决你的问题,请参考以下文章
JAVA1008 数组元素循环右移问题 (20分) PAT乙级 PAT (Basic Level) Practice (中文)