精华内容
下载资源
问答
  • 循环移位:循环左移和循环右移

    千次阅读 2019-11-10 20:10:18
           循环移位就是把数值变成二进制,然后循环移动的过程;换句话说,循环移位就是将移出的低位放到该数的高位(循环右移)或把移出的高位放到该数的低位(循环...

    https://blog.csdn.net/LiuBo_01/article/details/80149708

           循环移位就是把数值变成二进制,然后循环移动的过程;换句话说,循环移位就是将移出的低位放到该数的高位(循环右移)或把移出的高位放到该数的低位(循环左移),左移,和右移动都是对整数进行的操作,在Win32控制台应用程序中,整形占4Byte节32bit。


           循环左移的过程:
    这里写图片描述
           循环左移的过程可以分为3步:
    1. 将x左端的n位先移动到y的低n位中,x>>(32-n);
    2. 将x左移n位,其右面低位补0,x<<n;
    3. 进行按位或运算(x >> (32 - n) | (x << n));


           循环右移的过程:

    这里写图片描述
           循环右移的过程可以分为3步:
    1. 将x的左端的低n位先移动到y的高n位中x<<(32-n)
    2. 将x右移n位,其左面高n位补0x>>n;
    3.进行按位或操作(x << (32 - n) | (x >> n));


            假如将一个无符号的数据val,长度为N,需要循环移动n位。可以利用下面的公式:
            循环左移:(val >> (N - n) | (val << n))
            循环右移:(val << (32 - n) | (val >> n))


           C语言实现循环移位:循环移位是对二进制序列进行操作,所以实现循环移位先需要将需要移位的数转换为二进制序列,然后按照上面描述的步骤进行移位,最后将移位后的二进制序列打印出来;

    源代码

    #include <stdio.h>
    #include <Windows.h>
    
    //将一个十进制数转换为二进制
    void  trans_binary(unsigned int  val)
    {
        int a[32];
        int i = 0;
        for(i=0;i<=31;i++)
        { 
            a[i] = val % 2;
            val /= 2;
        }
        //倒序输出,每输出8位,输出一个空格
        for (int j = 31,k = 1; j >= 0; j--,k++)
        {
            printf("%d", a[j]);
            if (k % 8 == 0)
            {
                printf(" ");
            }
        }
        printf("\n");
    }
    
    //循环左移
    
    void left_move(unsigned val, int n)
    {
        unsigned int z;
        printf("需要移位的二进制序列为:\n");
        trans_binary(val);
        z = (val >> (32 - n) | (val << n));
        printf("移位后:\n");
        trans_binary(z);
    }
    
    void right_move(unsigned val, int n)
    {
        unsigned int z;
        printf("需要移位的二进制序列为:\n");
        trans_binary(val);
        z =  (val << (32 - n) | (val >> n));
        printf("移位后:\n");
        trans_binary(z);
    }
    
    int main()
    {
        int num = 0;
        int n = 0;
        int select = 0;
        printf("请输入要移位的数和移动位数:\n");
        scanf("%d%d", &num, &n);
        printf("请输入选择:(-1-:左移 -2-:右移 -0-:退出):\n");
        scanf("%d", &select);
        switch (select)
        {
        case 1:left_move(num, n);
            printf("\n");
            break;
        case 2:right_move(num, n);
            break;
        case 0:exit(0);
            break;
        default:
            printf("输入有误!\n");
            break;
        }
        system("pause");
        return 0;
    }
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72

    运行结果

    这里写图片描述

            为了更直观的显示结果,选取了一个比较大的数1234567891,移动位数:8,移动方式:循环左移;根据循环左移的方法,先取出高8(移动的位数)位,移动到底8位(右移24位),然后将其余位数依此左移8位,结果与运行结果一致。

    展开全文
  • 循环左移字符串

    2019-03-24 21:28:19
    汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。 对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。 例如,字符序列S=”abcXYZdef”,要求输出...
    '''
    汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。
    对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。
    例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
    '''
    # -*- coding:utf-8 -*-
    class Solution:
        def LeftRotateString(self, s, n):
            # write code here
            if s!="":
                n = n % len(s)
                if n == 0:
                    return s
                else:
                    return s[n:]+s[:n]
            return ""
    if __name__ == '__main__':
        s = Solution()
        str = ""
        n=2
        print(s.LeftRotateString(str,n))
    
    展开全文
  • 实现对一个无符号数的循环左移和循环右移 循环移位直接可用的函数(循环右移、循环左移) //val表示需要移位的数 n表示移位位数 //字节数乘以8代表一共多少位 //向右循环移n位的结果:假设数据一共size位,向左移...

    目录

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

    整体代码

    目录

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

    整体代码

    本文的小技巧

    注意的地方


    本文的小技巧


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

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

    //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语言-字符串循环左移

    千次阅读 2020-08-16 15:32:42
    字符串的循环左移,指的是将字符串整体向左移动,左部超出范围的字符回到右边,比如对于字符串123,它循环左移1位的结果是231。 在右侧编辑器中有一个函数Shift,它有两个参数str和n,str存有一个字符串,n为要左移...

    编程要求

    字符串的循环左移,指的是将字符串整体向左移动,左部超出范围的字符回到右边,比如对于字符串123,它循环左移1位的结果是231

    在右侧编辑器中有一个函数Shift,它有两个参数strnstr存有一个字符串,n为要左移的距离,为非负数

    请在这个函数中,将str循环左移n位,然后输出,占一行。

    输入数据由评测系统读取,并传递给Shift函数。具体见测试说明

    测试说明

    测试输入:123 1 预期输出:231

    测试输入:abc 0 预期输出:abc

    每组输入一行,有两个数据,分别对应strn

    方法一:

    #include <iostream>
    #include <cstring>
    using namespace std;
    /**********   Begin   **********/
    void Shift(char *str,int n)
    {
        int len=0,i;
    
        // char *p=str;
        // while(*p!='\0'){
        //     len++;
        //     p++;
        // } //求字符串长度
    
        len=strlen(str);
    
        n%=len;
       // printf("n=%d,len=%d",n,len);
    
        while(n--){
            char tmp = str[0];   
            for (int i=0; i<len-1; i++) 
    	    {  
                str[i] = str[i+1];  
            }  
            str[len-1] = tmp;  
        }
    
        cout << str << endl;
    
        // p=str;
        // while(*p!='\0'){
        //     printf("%c",*p);
        //     p++;
        // }//打印字符串
    }
    /**********   End   **********/

    方法二:

        #include <iostream>
        #include <cstring>
        using namespace std;
        /**********   Begin   **********/
        void rev(char *start,char *end)
        {
            while(start < end)
            {
                char t = *start;
                *start = *end;
                *end = t;
                start++;
                end--;
            }
        }
        void Shift(char *str,int n)
        {
            int len = strlen(str);
            n = n % len;
            rev(str,str + n - 1);
            rev(str + n, str + len - 1);
            rev(str,str + len - 1);
            cout << str << endl;
        }
        /**********   End   **********/
    

     

    展开全文
  • 循环左移时,将最高位重新放置最低位 循环右移时,将最低位重新放置最高位 使用循环操作的一个目的就是把每一位连续放到最左边,以判定数据的符号。如果要把一个数字的高位部分和低位部分互换,采用一位操作就很方便...
  • 逻辑左移时,最高位丢失,最低位补0;...循环左移时,将最高位重新放置最低位 循环右移时,将最低位重新放置最高位 例如: 1010100010101 逻辑左移一位结果为 0101000101010 逻辑右移一位结果为 01...
  • 一、java的左移 java的左右移操作的对象是补码; byte、char会转成int再操作; long类型不转换; double、float不可进行移动操作; System.out.println(1<<3);结果为8(1*2^3) Sy...
  • 逻辑左移时,最高位丢失,最低位补0; 逻辑右移时,最高位补0,最低位丢失; 算术左移时,依次左移一位,尾部补0,最高的符号位保持不变。...循环左移时,将最高位重新放置最低位 循环右移时,将...
  • 循环左移位运算

    2012-11-27 00:27:39
    本程序使用与初级接触C编程人员,可使用与二进制输出处理——循环左移位运算,亲笔操刀。
  • 字符串循环左移(20) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 8000 B 判题程序 Standard 作者 白洪欢(浙江大学) 输入一个字符串和一个非负整数N,要求将...
  • 用C语言实现循环左移,右移

    千次阅读 2008-10-13 15:27:00
    C51中实现循环左移、右移的库函数: #include&lt;intrins.h&gt; unsigned char _crol_( unsigned char c, /*charactertorotateleft*/ unsigned char b); /*bitpositionstorotate...
  • 字符串的循环左移 1、把 字符串的str的前k个字符移动到str的尾部 方法1:暴力法 每次循环左移一位,循环k次 时间复杂度O(kN),空间复杂度O(1) /** * 字符串的循环左移:把字符串str的前k个字符移动到字符串str的...
  • 那么对于无符号数和有符号数,对于左移和右移的操作分别是如何呢?下面通过实验来进行验证: 对于无符号数的左移和右移,代码片段如下: void main(void){ static UINT16 sTemp; sTemp = 0x0001; sTemp = ...
  • 51单片机之数码管动态循环左移显示手机号

    万次阅读 多人点赞 2018-05-30 20:20:46
    共阴极数码管16进制编码1~f如下:uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79...proteus中各元件符号表示:CRYSTAL 晶振 ;电解电容:CAP-即可搜到;电阻:r...
  • C++循环左移问题

    千次阅读 2011-10-15 16:35:05
    问题描述: 我在写循环左移函数时,写成如下格式: inline int Crol(int value, int bits) {  return value>(sizeof(value) * 8-bits); } 测试数据时候,发现出错。 对于0x800000
  • C/C++中没有循环左移和循环右移打操作符,需要自己实现 示例代码: #include /*循环左移*/ unsigned rol( unsigned val, int size) { unsigned res = val ; res |= val >> ( 32 - size); ...
  • 第二个知识点:循环左移右移函数 第一个知识点:预处理指令 一种预处理指令是#define,他把名字A定义为P0,当这个名字出现在源文件的任何地方时,他都会被替换为定义的值。 格式为:#define A P0 ; A为自定义...
  • 流水灯循环左移点亮

    千次阅读 2012-04-23 20:52:28
    #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 /*----------------------------------... unsigned int 是定义无符号整形变量,其值的范围是 0~65535 -----------------------------
  • LaTex常用特殊符号参考

    千次阅读 2016-05-10 16:46:43
    点我进入原文 LaTex常用特殊符号参考
  • 8位LED灯左移程序

    2015-02-12 19:29:14
    8位LED左移,直至LED全部点亮。使用左移符号
  • C语言(VC6.0)的无符号长整型是如何左移的,当左移的位数超过该数值类型的最大位数是怎么样处理的?求大神解答,不甚感激
  • 循环左移有两种方法: 一个是:左移运算符 我个人推荐 大括号,简约,快捷,清晰明朗。 二:程序 //======================================// //==Fosc : 50MHz //==Timescale : 1ns/1ns //==
  • } 四:循环左移 综上为循环左移点亮流水灯 蜂鸣器叫步骤: 一:查看原理图,明白蜂鸣器的线路, 二:知道蜂鸣器的线路,在程序页写上程序 编译下载,步骤同前。 观察板子反应,因为是在流水灯程序的基础上完成的...
  • 给出一个16位的无符号整数。称这个二进制数的前8位为“高位”,后8位为“低位”。现在写一程序将它的高低位交换。例如,数34520用二进制表示为: 1000011011011000 将它的高低位进行交换,我们得到了一个新的二...
  • `左移右移动可以干什么循环移动循环左移循环右移 左移动运算符 << 运算规则: x << y 将x的二进制形式向左移动y个位置,左侧移除,右侧补0 7 << 2 = 28 0000 0111 --7 << 2 --------------...
  • 文章目录文章背景本文受众正文循环位移类C语言的循环位移类Python语言的循环位移 文章背景 谷歌搜索"循环位移"以及"逻辑位移和算术位移"这两个关键字得到的前三篇文章实在是纰漏过多 于是笔者改为搜索"arithmetic ...
  • 逻辑移位是不考虑符号位的移位,算术移位是考虑符号位的移位。 1、无符号移位 例如右移 unsigned char x = 0x80 二进制 表示是 1000 0000 ,十进制是128 右移动一位,低位补0 变为 0000 0000 ,十进制是 0 ...
  • 字符串循环左移(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 白洪欢(浙江大学) 输入一个字符串和一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,734
精华内容 10,293
关键字:

循环左移符号