c语言循环位移(数字,字符串)
2011-09-15 09:07
218 查看
C语言中没有提供循环移位的操作符,但可以通过简洁的方式实现循环移位
设一个操作数x有s位则循环左移n位的操作为:
(x << n) | (x >> (s - n));
同理右移n位位:
(x >> n) | (x << (s - n));
实际编程中可以用宏定义实现循环移位:
#define ROTATE_LEFT(x, s, n) ((x) << (n)) | ((x) >> ((s) - (n)))
#define ROTATE_RIGHT(x, s, n) ((x) >> (n)) | ((x) << ((s) - (n)))
例如:
#include <stdio.h>
#define ROTATE_LEFT(x, s, n) ((x) << (n)) | ((x) >> ((s) - (n)))
#define ROTATE_RIGHT(x, s, n) ((x) >> (n)) | ((x) << ((s) - (n)))
int main()
{
unsigned int a;
scanf("%x", &a);
printf("%08x\n", a);
printf("%08x\n", ROTATE_LEFT(a, 8 * sizeof(int), 4));
printf("%08x\n", ROTATE_RIGHT(a, 8 * sizeof(int), 8));
return 0;
}
运行结果:
12345678 //原数
23456781 //移1位后
具体样例:
设有数据 a=01111011,循环左移2位 正确结果: 11101101
分步实现:
b=a>>(8-2) ;//用来得到正常左移丢失的位和循环移位后其正确位置 b="00000001";
a="a"<<2;//左移 a="11101100"
a=a|b; //a=11101101
如果不是用中间变量一步实现: a=(a>>(8-2))|(a<<2);
总长度N(8 16 32)
循环左移n (a>>(N-n))|(a>>n)
循环右移n (a<<(N-n))|(a>>n)
C语言的位运算功能是其区别于其他大多数高级程序设计语言的特色之一,用它可以方便实现一些特殊功能,灵活掌握是用C程序编写系统程序的基础。
其他对位进行操作的还有位域法;
几个对位操作的样例如下:
#define SETBIT(REG,N) REG|=(1<<N) //对REG的N位置1
#define CLRBIT(REG,N) REG&=~(1<<N) //对REG的N位清零
#define INVBIT(REG,N) REG^=(1<<N) //对REG的N位取反
===================================================================================================================================
我们在C语言中常常碰到字符串循环左右移位的题型,下面对其进行详解:
例如:有一组char的字符串:abcdefghijk 。你要循环左移3位变成ijkabcdefgh(也有写出ijkabcdefghi);或右移三位变成defghijkabc(也有写成cdefghijkabc);
首先我们来解决字符串循环右移的问题:
方法一:利用已有的字符串函数。
#include<stdio.h>
#include<string.h>
void rightloop(char *a, int n);
main()
{
char a[100]; int n;
printf("请输入要循环的字符串:/n");
scanf("%s",a);
printf("请输入要循环字符串的位数:/n");
scanf("%d",&n); //以上代码也可以直接赋初值,我考虑的是一般情况//
void rightloop(a,n); //本例以a[]="abcdefghijk", n=3为例讲解//
printf("输出循环右移的字符串:%s/n",a);
}
void rightloop(char *a, int n)
{
char b[100]; //数组b要做的够大即可//
int m;
m=strlen(a)-n; //求出除去要循环右移之后剩下的字符的个数//
strcpy(b,a+n); // a+n,a代表a[0]的地址再加上n,表示要把a
之后的字符串(即那些不用循环右移的字符,共有m个)复制到数组b中。这时b[]="defghijk"。 //
strcpy(b+m,a); // b+m, 因为上面已经把没有循环的m个字符赋给了b,所以b[m]之前的不能在赋值了,只能把a的全部字符串赋给b[m]之后的空间了。这时b[]="defghijkabcdefghijk"。//
*(b+strlen(a))='/0'; //这里是问题的关键,要根据a字符串的长度来舍弃b数组中多余的字符串,并给数 组b加结束符。这时b[]="defghijkabc";//
strcpy(a,b); //把数组b中调整好的字符串重新赋给数组a。//
}
方法二:就是用简单的c语句;
#include<stdio.h>
void rightloop(char , int )
main()
{
char a[100]; int n;
printf("请输入要循环的字符串:/n");
scanf("%s",a);
printf("请输入要循环字符串的位数:/n");
scanf("%d",&n); //以上代码也可以直接赋初值,我考虑的是一般情况//
void rightloop(a,n); //本例以a[]="abcdefghijk", n=3为例讲解//
printf("输出循环右移的字符串:%s/n",a);
}
void rightloop(char a[ ], int n)
{
int i=0,j=0,k=0;
int m; char b[100];
while(a[i]!='/0')
{ i++; } //这里用i来计算数组a中字符串的大小;//
while(a
!='/0')
{
b[j]=a
; j++; n++;
} //这里是把不需要循环右移的字符串赋值到数组b中;b[ ]="defghijk"。//
while(a[k]!='/0')
{
b[j]=a[k]; j++; k++;
} //因为上一个while循环中,数组b已经赋值到b[j]了。所以这里直接从b[j]开始把数组a中的字符串全部赋值到数组b[j]以后的空间中;b [ ]="defghijkabcdefghijk";//
b[i]='/0'; //通过用数组a中字符串的长度i来调整数组b的长度,删去数组b中多余的字符串 ,b[]="defghijklabc"。
for(i=0;b[i]!='/0';i++)
{ a[i]=b[i]; } //把数组b中调整好的字符串重新赋给数组a。//
}
再次我们来解决字符串循环左移的问题
方法一:调用已经有的字符串函数。
#include<stdio.h>
#include<string.h>
void leftloop(char *a, int n);
main()
{
char a[100]; int n;
printf("请输入要循环的字符串:/n");
scanf("%s",a);
printf("请输入要循环字符串的位数:/n");
scanf("%d",&n); //以上代码也可以直接赋初值,我考虑的是一般情况//
void leftloop(a,n); //本例以a[]="abcdefghijk", n=3为例讲解//
printf("输出已经循环左移的字符串:%s/n",a);
}
void leftloop(char*a,int n)
{char b[100]; //数组b要做的够大即可//
int m;
m=strlen(a)-n; //求出除去要循环右移之后剩下的字符的个数//
strcpy(b,a+m); // a+m,a代表a[0]的地址再加上m,表示要把a[m]之后的字符串(即那些需要循环左移的字符,共有n个)复制到数组b中。这时b[]="ijk"。 //
strcpy(b+n,a); // b+n, 因为上面已经把需要循环的n个字符赋给了b,所以b
之前的不能在赋值了,只能把a的全部字符串赋给b
之后的空间了。这时b[]="ijkabcdefghijk"。//
*(b+strlen(a))='/0'; //这里是问题的关键,要根据a字符串的长度来舍弃b数组中多余的字符串,并给数组b加结束符。这时b[]="ijkabcdefgh";//
strcpy(a,b); //把数组b中调整好的字符串重新赋给数组a。//
}
方法二:就是用简单的c语句;#include<stdio.h>
void leftloop(char , int )
main()
{
char a[100]; int n;
printf("请输入要循环的字符串:/n");
scanf("%s",a);
printf("请输入要循环字符串的位数:/n");
scanf("%d",&n); //以上代码也可以直接赋初值,我考虑的是一般情况//
void leftloop(a,n); //本例以a[]="abcdefghijk", n=3为例讲解//
printf("输出已经循环左移的字符串:%s/n",a);
}
void leftloop(char a[ ], int n)
{
int i=0,j=0,k;
int m; char b[100];
while(a[i]!='/0')
{ i++; } //这里用i来计算数组a中字符串的大小;//
k=m=i-n; //计算出前面有多少个字符不用移动//
while(a[k]!='/0')
{
b[j]=a[k]; j++; k++;
} //因为这时k=i-m,a[k]表示需要循环移动的第一个字符,这里是把需要循环右移的字符串赋值到数组b中;b[ ]="ijk"。//
b[j]='/0';
m--;k--; //因为要用m调节下面的循环但是要从0开始所以比实际的多了一次;k--是为了要留着数组a中的结束符,不出现乱码;//
while(m>=0)
{
a[k]=a[m]; m--; k--;
} // 原来a[k]=“abcdefghijk",a[m]="abcdefgh",赋值之后a[k]="abcabcdefgh";//
for(i=0;b[i]!='/0';i++)
{ a[i]=b[i]; } //把数组b中调整好的字符串重新赋给数组a。b[i]="ijk";a[i]="abcabcdefgh"。赋值之后a[i]="j//
}
设一个操作数x有s位则循环左移n位的操作为:
(x << n) | (x >> (s - n));
同理右移n位位:
(x >> n) | (x << (s - n));
实际编程中可以用宏定义实现循环移位:
#define ROTATE_LEFT(x, s, n) ((x) << (n)) | ((x) >> ((s) - (n)))
#define ROTATE_RIGHT(x, s, n) ((x) >> (n)) | ((x) << ((s) - (n)))
例如:
#include <stdio.h>
#define ROTATE_LEFT(x, s, n) ((x) << (n)) | ((x) >> ((s) - (n)))
#define ROTATE_RIGHT(x, s, n) ((x) >> (n)) | ((x) << ((s) - (n)))
int main()
{
unsigned int a;
scanf("%x", &a);
printf("%08x\n", a);
printf("%08x\n", ROTATE_LEFT(a, 8 * sizeof(int), 4));
printf("%08x\n", ROTATE_RIGHT(a, 8 * sizeof(int), 8));
return 0;
}
运行结果:
12345678 //原数
23456781 //移1位后
具体样例:
设有数据 a=01111011,循环左移2位 正确结果: 11101101
分步实现:
b=a>>(8-2) ;//用来得到正常左移丢失的位和循环移位后其正确位置 b="00000001";
a="a"<<2;//左移 a="11101100"
a=a|b; //a=11101101
如果不是用中间变量一步实现: a=(a>>(8-2))|(a<<2);
总长度N(8 16 32)
循环左移n (a>>(N-n))|(a>>n)
循环右移n (a<<(N-n))|(a>>n)
C语言的位运算功能是其区别于其他大多数高级程序设计语言的特色之一,用它可以方便实现一些特殊功能,灵活掌握是用C程序编写系统程序的基础。
其他对位进行操作的还有位域法;
几个对位操作的样例如下:
#define SETBIT(REG,N) REG|=(1<<N) //对REG的N位置1
#define CLRBIT(REG,N) REG&=~(1<<N) //对REG的N位清零
#define INVBIT(REG,N) REG^=(1<<N) //对REG的N位取反
===================================================================================================================================
我们在C语言中常常碰到字符串循环左右移位的题型,下面对其进行详解:
例如:有一组char的字符串:abcdefghijk 。你要循环左移3位变成ijkabcdefgh(也有写出ijkabcdefghi);或右移三位变成defghijkabc(也有写成cdefghijkabc);
首先我们来解决字符串循环右移的问题:
方法一:利用已有的字符串函数。
#include<stdio.h>
#include<string.h>
void rightloop(char *a, int n);
main()
{
char a[100]; int n;
printf("请输入要循环的字符串:/n");
scanf("%s",a);
printf("请输入要循环字符串的位数:/n");
scanf("%d",&n); //以上代码也可以直接赋初值,我考虑的是一般情况//
void rightloop(a,n); //本例以a[]="abcdefghijk", n=3为例讲解//
printf("输出循环右移的字符串:%s/n",a);
}
void rightloop(char *a, int n)
{
char b[100]; //数组b要做的够大即可//
int m;
m=strlen(a)-n; //求出除去要循环右移之后剩下的字符的个数//
strcpy(b,a+n); // a+n,a代表a[0]的地址再加上n,表示要把a
之后的字符串(即那些不用循环右移的字符,共有m个)复制到数组b中。这时b[]="defghijk"。 //
strcpy(b+m,a); // b+m, 因为上面已经把没有循环的m个字符赋给了b,所以b[m]之前的不能在赋值了,只能把a的全部字符串赋给b[m]之后的空间了。这时b[]="defghijkabcdefghijk"。//
*(b+strlen(a))='/0'; //这里是问题的关键,要根据a字符串的长度来舍弃b数组中多余的字符串,并给数 组b加结束符。这时b[]="defghijkabc";//
strcpy(a,b); //把数组b中调整好的字符串重新赋给数组a。//
}
方法二:就是用简单的c语句;
#include<stdio.h>
void rightloop(char , int )
main()
{
char a[100]; int n;
printf("请输入要循环的字符串:/n");
scanf("%s",a);
printf("请输入要循环字符串的位数:/n");
scanf("%d",&n); //以上代码也可以直接赋初值,我考虑的是一般情况//
void rightloop(a,n); //本例以a[]="abcdefghijk", n=3为例讲解//
printf("输出循环右移的字符串:%s/n",a);
}
void rightloop(char a[ ], int n)
{
int i=0,j=0,k=0;
int m; char b[100];
while(a[i]!='/0')
{ i++; } //这里用i来计算数组a中字符串的大小;//
while(a
!='/0')
{
b[j]=a
; j++; n++;
} //这里是把不需要循环右移的字符串赋值到数组b中;b[ ]="defghijk"。//
while(a[k]!='/0')
{
b[j]=a[k]; j++; k++;
} //因为上一个while循环中,数组b已经赋值到b[j]了。所以这里直接从b[j]开始把数组a中的字符串全部赋值到数组b[j]以后的空间中;b [ ]="defghijkabcdefghijk";//
b[i]='/0'; //通过用数组a中字符串的长度i来调整数组b的长度,删去数组b中多余的字符串 ,b[]="defghijklabc"。
for(i=0;b[i]!='/0';i++)
{ a[i]=b[i]; } //把数组b中调整好的字符串重新赋给数组a。//
}
再次我们来解决字符串循环左移的问题
方法一:调用已经有的字符串函数。
#include<stdio.h>
#include<string.h>
void leftloop(char *a, int n);
main()
{
char a[100]; int n;
printf("请输入要循环的字符串:/n");
scanf("%s",a);
printf("请输入要循环字符串的位数:/n");
scanf("%d",&n); //以上代码也可以直接赋初值,我考虑的是一般情况//
void leftloop(a,n); //本例以a[]="abcdefghijk", n=3为例讲解//
printf("输出已经循环左移的字符串:%s/n",a);
}
void leftloop(char*a,int n)
{char b[100]; //数组b要做的够大即可//
int m;
m=strlen(a)-n; //求出除去要循环右移之后剩下的字符的个数//
strcpy(b,a+m); // a+m,a代表a[0]的地址再加上m,表示要把a[m]之后的字符串(即那些需要循环左移的字符,共有n个)复制到数组b中。这时b[]="ijk"。 //
strcpy(b+n,a); // b+n, 因为上面已经把需要循环的n个字符赋给了b,所以b
之前的不能在赋值了,只能把a的全部字符串赋给b
之后的空间了。这时b[]="ijkabcdefghijk"。//
*(b+strlen(a))='/0'; //这里是问题的关键,要根据a字符串的长度来舍弃b数组中多余的字符串,并给数组b加结束符。这时b[]="ijkabcdefgh";//
strcpy(a,b); //把数组b中调整好的字符串重新赋给数组a。//
}
方法二:就是用简单的c语句;#include<stdio.h>
void leftloop(char , int )
main()
{
char a[100]; int n;
printf("请输入要循环的字符串:/n");
scanf("%s",a);
printf("请输入要循环字符串的位数:/n");
scanf("%d",&n); //以上代码也可以直接赋初值,我考虑的是一般情况//
void leftloop(a,n); //本例以a[]="abcdefghijk", n=3为例讲解//
printf("输出已经循环左移的字符串:%s/n",a);
}
void leftloop(char a[ ], int n)
{
int i=0,j=0,k;
int m; char b[100];
while(a[i]!='/0')
{ i++; } //这里用i来计算数组a中字符串的大小;//
k=m=i-n; //计算出前面有多少个字符不用移动//
while(a[k]!='/0')
{
b[j]=a[k]; j++; k++;
} //因为这时k=i-m,a[k]表示需要循环移动的第一个字符,这里是把需要循环右移的字符串赋值到数组b中;b[ ]="ijk"。//
b[j]='/0';
m--;k--; //因为要用m调节下面的循环但是要从0开始所以比实际的多了一次;k--是为了要留着数组a中的结束符,不出现乱码;//
while(m>=0)
{
a[k]=a[m]; m--; k--;
} // 原来a[k]=“abcdefghijk",a[m]="abcdefgh",赋值之后a[k]="abcabcdefgh";//
for(i=0;b[i]!='/0';i++)
{ a[i]=b[i]; } //把数组b中调整好的字符串重新赋给数组a。b[i]="ijk";a[i]="abcabcdefgh"。赋值之后a[i]="j//
}
相关文章推荐
- c语言循环位移(数字,字符串)
- 【c语言】为下面的函数原型编写函数定义,这个字符串参数必须包含一个或者多个数字,函数应该把这些数字字符转换为整数并返回这个整数。
- C语言 编写一个c程序实现字符串到数字的转化
- C语言中字符串转换为数字和数字转换为字符串库函数
- C语言:编写一个程序统计输入字符串中,各个数字、空白字符、以及其他所有字符出现的次数。
- 不用库函数,用C语言实现将一整型数字转化为字符串
- 返回字符串中最长的数字串----C语言练习题
- C语言 找出字符串中的数字,开辟空间储存它们,并输出这些数字
- 【c语言】递归 实现n^k,求非负整数各位数字之和,逆置字符串
- 数据结构 c语言实现链式循环队列(输入数字入队 输入字母出队)
- C语言中将数字转换为字符串的方法
- C语言--字符串和数字的相互转换
- C语言用分别用递归和循环求数字的阶乘的方法
- C语言 数字转字符串的函数
- c语言练习 10-4. 字符串循环左移(20)
- C语言数字与字符串转换 atoi()函数、itoa()函数、sprintf()函数
- 【C语言】为下面的函数原型编写函数定义: int ascii_to_integer(char *str); 这个字符串参数必须包含一个或者多个数字,函数应该把这些数字字符转换为整数并返回这个整数。
- C语言将字符串转换成对应的数字(十进制、十六进制)
- 不用库函数,用c语言实现将一整型数字转化为字符串
- C语言中关于字符串左右循环移位的问题