C/C++如何实现循环左移,循环右移

这篇文章主要介绍了C/C++如何实现循环左移,循环右移,具有很好的参考价值,希望对大家有所帮助。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

实现对一个无符号数的循环左移和循环右移

循环移位直接可用的函数(循环右移、循环左移)

  • //val表示需要移位的数 n表示移位位数
  • //字节数乘以8代表一共多少位
  • //向右循环移n位的结果:假设数据一共size位,向左移size-n位,再与原数右移n位进行或操作的结果
//val表示需要移位的数 n表示移位位数
//字节数乘以8代表一共多少位
//向右循环移n位的结果:假设数据一共size位,向左移size-n位,再与原数右移n位进行或操作的结果
uint32 bit_move(uint32 val, int n) {
    uint32 size = sizeof(val) * 8;
    n = n % size;
    //return (val >> (size - n) | (val << n));//左移
    return (val << (size - n) | (val >> n));//右移
}

整体代码

如果出现头文件报错,去我主页搜关键词“bits/stdc++.h”

#include<bits/stdc++.h>
 
using namespace std;
 
typedef unsigned short int uint16;
typedef unsigned int uint32;
 
uint32 bit_move(uint32 val, int n) {
    uint32 size = sizeof(val) * 8;
    n = n % size;
    //return (val >> (size - n) | (val << n));
    return (val << (size - n) | (val >> n));
}
 
int main() {
    uint16 a;
    //cin >> hex >> a;
    scanf_s("%hd", &a);//16进制的两种输入方式 (这个地方如果是十进制输入,会栈溢出,为什么?)
    cout << "原始数据的二进制16位表示:  " << bitset<16>(a) << endl;
    uint32 a1 = (uint32)a;
    cout << "转换为32位后,右移之前的值:" << bitset<32>(a1) << endl;
    uint32 res = bit_move(a1, 2);
    cout << "右移2位后结果:             " << bitset<32>(res) << endl;
    //for (int i = 1; i < 3; i++) {
    //    a1 = bit_move(a1, 1);
    //    cout << "右移"<< i << "位后结果:           "<< bitset<32>(a1) << endl;
    /

本文标题为:C/C++如何实现循环左移,循环右移

基础教程推荐