iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C/C++如何实现循环左移,循环右移
  • 281
分享到

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

2024-04-02 19:04:59 281人浏览 泡泡鱼
摘要

目录实现对一个无符号数的循环左移和循环右移循环移位直接可用的函数(循环右移、循环左移)整体代码本文的小技巧注意的地方字符串循环左|右移实现(C/C++)字符串循环右移K位字符串循环左

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

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

  • //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;
    //}
    return 0;
}

执行结果

2
原始数据的二进制16位表示:  0000000000000010
转换为32位后,右移之前的值:00000000000000000000000000000010
右移2位后结果:             10000000000000000000000000000000

本文的小技巧

输入16进制的方式

cin >> hex >> a;
scanf_s("%hd", &a)

int型 输出x位二进制的方式

cout << bitset<32>(x) << endl;//如果输出64位,则填64

注意的地方

这个地方如果是十进制输入,会栈溢出,为什么?因为定义在栈上的局部变量a为16位,如果按%d输入,则会占用32位,这样的话程序运行结束系统只会处理16位,剩下的16位就破坏了堆栈

uint16 a;
//cin >> hex >> a;
scanf_s("%hd", &a);//16进制的两种输入方式

字符串循环左|右移实现(C/C++)

字符串循环右移K位

(1)图解思考

(2)代码实现

时间复杂度O(n) | 空间复杂度O(1)

// 三次翻转实现
#include <iOStream>
#include <cstring>

void reverse(char str[],int start,int end){
    for( ;start < end; start++,end--){
        char tmp = str[start];
        str[start] = str[end];
        str[end] = tmp;
        // start++;
        // end--;
    }
}

void rotateStrRight(char str[], int offset,int len){
        if(str == nullptr || len == 0){
            return;
        }
        offset = offset % len;
        // 三次翻转
        reverse(str, 0, len-offset-1);
        reverse(str, len-offset, len-1);
        reverse(str, 0, len-1);
}

int main(){
    int  steps = 2;
    char str[] = "12ab";
    int  len = strlen(str);
    //printf("len = %d\n",len);
    printf("移动前: %s\n", str);
    rotateStrRight(str,steps,len);
    printf("移动后:%s\n", str);
}

字符串循环左移K位

(1)说明

 # 字符串循环左移

(1)左移与右移同理,只是划分段的方向相反,交换区间自然有区别
(2)例如:1234ab,循环左移4位(从左划分)
(3)1234|ab -> 4321|ab -> 4321|ba -> ab1234
(4)例如:1234ab,循环右移4位
(5)12|34ab -> 21|34ab -> 21|ba43 -> 34ab12

(2)代码实现

// 三次翻转实现
#include <iostream>
#include <cstring>

void reverse(char str[],int start,int end){
    for( ;start < end; start++,end--){
        char tmp = str[start];
        str[start] = str[end];
        str[end] = tmp;
    }
}

void rotateStrLeft(char str[], int offset,int len){
    if(str == nullptr || len == 0){
        return;
    }
    offset = offset % len;
    // 三次翻转
    reverse(str, 0, offset-1);
    reverse(str, offset, len-1);
    reverse(str, 0, len-1);
}

int main(){
    int  steps = 3;
    char str[] = "1234ab"; // 4ab123
    int  len = strlen(str);
    //printf("len = %d\n",len);
    printf("移动前: %s\n", str);
    rotateStrLeft(str,steps,len);
    printf("移动后:%s\n", str);
}

循环左右移结果相同条件

(1)str.length / 2 = offset

(2)测试结果(8/2 = 4)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

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

本文链接: https://www.lsjlt.com/news/164965.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C/C++如何实现循环左移,循环右移
    目录实现对一个无符号数的循环左移和循环右移循环移位直接可用的函数(循环右移、循环左移)整体代码本文的小技巧注意的地方字符串循环左|右移实现(C/C++)字符串循环右移K位字符串循环左...
    99+
    2024-04-02
  • c语言实现数组循环左移m位
    目录c语言数组循环左移m位数组循环左移的简单方法输入格式输出格式c语言数组循环左移m位 #include<stdio.h> //函数原型 void rightshiftl...
    99+
    2024-04-02
  • python 列表元素左右循环移动 的多种解决方案
    如下所示: #待处理列表 A= [1,2,3,4,5] #移动次数 a = 3 右移比较简单 for i in range(a): A.insert(0,A.pop())...
    99+
    2024-04-02
  • C语言中如何实现for循环
    这篇文章主要介绍“C语言中如何实现for循环”,在日常操作中,相信很多人在C语言中如何实现for循环问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言中如何实现for循环”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-17
  • C#循环与循环控制的表达式树实现
    C# 提供了以下几种循环类型。 循环类型描述while 循环当给定条件为真时,重复语句或语句组。它会在执行循环主体之前测试条件。for/foreach 循环多次执行一个语句序列,简化...
    99+
    2024-04-02
  • C语言如何实现循环输入
    目录C语言实现循环输入根据次数循环输入根据条件循环输入C语言之循环语句一. while 二. for三. do while四. goto语句总结C语言实现循环输入 根据次数...
    99+
    2023-02-05
    C语言循环输入 C语言循环 C循环输入
  • 数组循环移位操作实例
    题: 如标题,要求时间复杂度为O(N)。解法:右移k位,前k位逆序,后N-k位逆序,再整个逆序即可。复制代码 代码如下:#include <stdio.h> &...
    99+
    2022-11-15
    数组 循环 移位
  • js文字左右循环滚动效果怎么实现
    要实现文字的左右循环滚动效果,可以使用以下步骤:1. 创建一个包裹文字的容器元素,并设置其宽度为容器元素的父元素宽度的倍数,这样文字...
    99+
    2023-08-09
    js
  • C#怎么实现无限循环
    本篇内容主要讲解“C#怎么实现无限循环”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#怎么实现无限循环”吧!循环控制语句循环控制语句更改执行的正常序列。当执行离开一个范围时,所有在该范围中创建...
    99+
    2023-06-17
  • C++如何实现转置矩阵的循环
    这篇文章主要介绍了C++如何实现转置矩阵的循环,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言矩阵的转置主要考查我们对循环的使用,通过简单的循环结构,我们可以很方便的完成矩...
    99+
    2023-06-22
  • c语言getchar如何循环
    要使用`getchar`函数进行循环读取字符,可以使用`while`循环结构。以下是一个示例代码:```c#include int ...
    99+
    2023-08-31
    c语言 getchar
  • C语言如何实现顺序循环队列
    这篇文章将为大家详细讲解有关C语言如何实现顺序循环队列,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、队列和循环队列基本概念队列:和栈相反,队列是一种先进先出(FIFO)的线性表。只允许在一端插入,在另...
    99+
    2023-06-29
  • C++实现转置矩阵的循环
    目录前言一、思路分析二、代码实现1.转置矩阵函数2.调用函数实现转置矩阵总结前言 矩阵的转置主要考查我们对循环的使用,通过简单的循环结构,我们可以很方便的完成矩阵的转置。 一、思路...
    99+
    2024-04-02
  • C++如何实现带头双向循环链表
    这篇文章主要为大家展示了“C++如何实现带头双向循环链表”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++如何实现带头双向循环链表”这篇文章吧。什么是带头双向循环链表什么是带头?双向?循环?(...
    99+
    2023-06-29
  • C++实现约瑟夫环的循环单链表
    约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知 n 个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。. 从编号为 k 的人开始报数,数到 m 的那个人出圈;他的下一个人...
    99+
    2024-04-02
  • C语言实现循环双链表
    本文实例为大家分享了C语言实现循环双链表的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #...
    99+
    2024-04-02
  • thinkphp6如何实现循环
    这篇文章将为大家详细讲解有关thinkphp6如何实现循环,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。第一种:volist标签语法:{volist name="" ...
    99+
    2023-06-14
  • JavaScript如何实现循环
    这篇文章主要为大家展示了“JavaScript如何实现循环”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript如何实现循环”这篇文章吧。循环1.f...
    99+
    2024-04-02
  • 微信小程序如何实现循环及嵌套循环
    这篇文章主要为大家展示了“微信小程序如何实现循环及嵌套循环”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信小程序如何实现循环及嵌套循环”这篇文章吧。微信小程序...
    99+
    2024-04-02
  • ubuntu中如何实现循环
    ubuntu中实现循环的示例:直接用bash解释脚本,如:“bash ./xxx”脚本例如:#!/bin/bash#这样就直接指定bash解释read ntotal=0for((i=2;i...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作