C#实现循环移位

  在位操作中,经常需要使用循环移位,然而 C# 貌似没有提供循环移位的函数或方法。当我们需要使用循环移位时,我们必须自己定义一个函数或方法来实现循环移位。这里以 64 位的数据循环移位为例,给出了一种可行的代码。代码经测试可以对占 8 个字节的Int64 类型的整数进行左右循环移位,不足之处是不能对任意类型的数据进行循环移位(使用函数重载的方式感觉太麻烦),大神若有解决方法还望赐教。

  函数的参数分别为:

     ref Int64 str ,表示要移位的Int64的整型数,这里添加了 ref 是为了使传入的值能够被改变;

     int i,表示要移动的位数;

     bool isLeft=true,确定是左移还是右移,缺省值为 true,即左移。

        private void cycleShift(ref Int64 str,int i,bool isLeft=true)        //循环移位,长度为 64 位
        {
            Int64 temp = 0;                 // 64 位整型数
            temp |= str;                    //临时存储str的值
            if (isLeft)                     //向左移位
            {
                str <<= i;                  //输入数据向左移动 i 位
                temp >>= (64 - i);          //temp 向右移动 64 - i 位
                str |= temp;                //将两个移位后的变量合并
            }
            else
            {
                str >>= i;                  //输入数据向左移动 i 位
                temp <<= (64 - i);          //temp 向右移动 64 - i 位
                str |= temp;                //将两个移位后的变量合并
            }
        }
时间: 2024-12-29 21:38:31

C#实现循环移位的相关文章

转:数组循环移位

数组循环移位 要求:设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量. 不合题意的解法如下: 我们先试验简单的办法,可以每次将数组中的元素右移一位,循环K次.abcd1234→4abcd123→34abcd12→234abcd1→1234abcd. 版本1 void RightShift(char *arr, int N, int k){    while(k--)    {        char t = arr[N-1];        

2016华为上机题一(循环移位)

1.循环数组移位 输入10个整整数的数组,在输入一个正整数m,将数组的后m位进行循环移位.计算移位后的前m个数和后m个数的和. 1 2 3 4 5 6 7 8 9 10 3 8 9 10 1 2 3 4 5 6 7 27 18 1 #include <iostream> 2 #include <stdio.h> 3 #include <cmath> 4 #include <string> 5 #include <algorithm> 6 #inc

笔试面试4 字符串的循环移位算法

字符串的循环移位是指将整个字符串左移或者后移n位. 例如:ab1234左移两位就是1234ab. 这个算法的实现是利用三次反转. 仔细观察发现,左移和后移后,1234和ab的顺序是不变的. 将1234和ab看成两个整体. 左移可以通过以下变换得到. 先将ab反转,得到ba1234; 然后反转另一部分,1234,得到ba4321; 最后将整个反转,就得到了1234ab,即左移两位后的字符串. 代码实现为:(限定n的值为合法值,即n>=0&&n<strlen(str)) #incl

编程之美2.17 数组循环移位

问题描述: 设计一个算法,把一个含有N元素的数组循环左移或者右移K位. 解决方法: 1. 暴力解法------O(KN) 2. 颠倒位置------O(N) 具体思路和代码: 1. 暴力解法------O(KN) 思路:循环K次,每次移动一位 代码: 1 //右移 2 void s1(int A[], int n, int k) 3 { 4 k = k % n; 5 for(int i = 0; i < k; i++) 6 { 7 int t = A[n-1]; 8 for(int j = n-

实现字符串右循环移位

实现字符串右循环移位函数,例如"abcdef"循环右移2位就是"cdefab". #include <stdio.h> #include <stdlib.h> void left_move(char arr[], int k) { int i = 0; int len = strlen(arr); for (i = 0; i<k; i++) { char tmp = arr[0]; int j = 0; for (j = 0; j<

【Tsinghua OJ】循环移位(Cycle)

Description Cycle shifting refers to following operation on the sting. Moving first letter to the end and keeping rest part of the string. For example, apply cycle shifting on ABCD will generate BCDA. Given any two strings, to judge if arbitrary time

循环移位法和数据拼接法基于led

功能描述 让led每隔0.5s从两边向中间闪烁,然后在从中间向两边闪烁,不断循环 项目实现 开发板 晶振为50M,那么达到0.5s时计数器count1需要达到24_999_999这么多次数 计数器代码为 1 [email protected](posedge CLK or negedge RSTn) 2 if(!RSTn) 3 Count1<=28'd0; 4 else if(Count1==TIME) 5 Count1<=28'd0; 6 else 7 Count1<=Count1+1

定时器---实现流水灯循环移位点亮

程序功能:用T0计时器,采用方式1实现流水灯的循环移位点亮. 声明:采用T0技术,工作于方式1 间隔1秒点亮,定时50ms,20次. 初值计算:65536-50000=3CB0H ;利用T0产生1s定时 ORG 0000H AJMP MAIN ; ORG 000BH ;T0定时服务子程序入口地址 AJMP SERVE ; ORG 0100H ; MAIN:MOV SP,#60H ; MOV B,#14H ;20次 MOV TMOD,#01H ;设置方式1 MOV TL0,#0B0H ;定时器赋初

给定一个二进制数,要求循环移位,在原二进制数中操作(C语言)

int b = 0, c = 0;// b 输入的0~255之间的数 c 移动位数 printf("请输入一个整数和移动位数\n"); scanf("%d%d", &b, &c); unsigned char a = b; unsigned char left = 0;//存储左移之后的结果     unsigned char right = 0;//存储右移之后的结果     //循环移位 right = a >> c; left =