本文主要介绍了C/C如何循环左移和循环右移,有很好的参考价值。希望对大家有帮助。有很好的参考价值,希望对大家有所帮助。如有错误或不足之处,请不吝赐教。
目录
实现可直接用于无符号数的循环左移和循环右移(循环右移,循环左移)的函数。本文提示的全部代码:注意,局部字符串循环左移|右移实现(C/C)字符串循环右移K位字符串循环左移K位循环左移相同的结果。
实现对一个无符号数的循环左移和循环右移
循环移位直接可用的函数(循环右移、循环左移)
//val表示要移位的数字。n表示移位的位数。//字节数乘以8表示总位数。//循环右移N位的结果:假设数据共有size位,先将size-n位左移,然后用原数右移N位,得到OR运算的结果。
//val表示要移位的位数,N表示移位的位数。
//字节数乘以8代表总位数。
//循环右移N位的结果:假设数据共有size位,将size-n位左移,然后用原数右移N位,得到OR运算的结果。
uint32 bit_move(uint32 val,int n) {
uint 32 size=sizeof(val)* 8;
n=n %大小;
//return(val(size-n)|(val n));//向左移动
return(val(size-n)|(val n));//向右移动
}
整体代码
如果头文件有错误,去我的主页搜索关键词“bits/stdc。h "
#includebits/stdc。h
使用命名空间std
typedef无符号短整型uint16
typedef无符号int uint32
uint32 bit_move(uint32 val,int n) {
uint 32 size=sizeof(val)* 8;
n=n %大小;
//return(val(size-n)|(val n));
return(val(size-n)|(val n));
}
int main() {
uint 16 a;
//cin十六进制a;
scanf_s('%hd ',a);//十六进制的两种输入法(如果这个地方是十进制输入,堆栈会溢出。为什么?)
cout原始数据的16位二进制表示形式:“bitset 16(a)endl;
uint 32 a1=(uint 32)a;
cout '转换为32位后,右移前的值:' bitset 32(a1)endl;
uint32 res=bit_move(a1,2);
“Cout”右移2位,结果是:“bit set 32(RES)endl;
//for(int I=1;i3;i ) {
//a1=bit_move(a1,1);
//cout '右移' I '位结果:' bit set 32(a1)endl;
//}
返回0;
}
执行结果
2
原始数据的16位二进制表示:00000000000010
转换为32位后,右移前的值:00000000000000000000000000010
右移2位后的结果:10000000000000000000000000000000
本文的小技巧
输入十六进制方法。
cin十六进制a;
scanf_s('%hd ',a)
int类型输出x位二进制。
cout位集32(x)endl;//如果输出64位,则填入64位。
注意的地方
如果这个位是十进制输入,堆栈就会溢出。为什么?因为栈上定义的局部变量A是16位的,如果按下%d,会占用32位。这种情况下,程序运行后系统只会处理16位,剩下的16位会销毁堆栈。
uint 16 a;
//cin十六进制a;
scanf_s('%hd ',a);//十六进制的两种输入模式
字符串循环左|右移实现(C/C++)
字符串循环右移K位
(1)图形思维
(2)代码实现
时间复杂度O(n) |空间复杂度O(1)
//实现三翻。
#包括iostream
#包括cstring
void reverse(char str[],int start,int end){
for(;开始结束;开始,结束- ){
char tmp=str[start];
str[start]=str[end];
str[end]=tmp;
//启动;
//end-;
}
}
void rotater right(char str[],int offset,int len){
if(str==nullptr || len==0){
返回;
}
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(字符串、步骤、长度);
Printf('移动后:%s\n ',str);
}
字符串循环左移K位
(1)描述
#字符串向左循环移动
(1)左移和右移一样,只是段的划分方向相反,交换间隔自然不同。
(2)例如:1234ab,循环左移4位(从左划分)
(3)1234 | a b-4321 | a b-4321 | ba-ab 1234
(4)例如:1234ab,循环右移四位
(5)12 | 34ab-21 | 34ab-21 | ba43-34ab 12
(2)代码实现
//三次翻转实现
#包括输入输出流
#包括cstring
void reverse(char str[],int start,int end){
for(;开始结束;开始,结束- ){
char tmp=str[start];
str[start]=str[end];
str[end]=tmp;
}
}
void rotator left(char str[],int offset,int len){
if(str==nullptr || len==0){
返回;
}
偏移=偏移% len
//三次翻转
reverse(str,0,offset-1);
reverse(str,offset,len-1);
reverse(str,0,len-1);
}
int main(){
int steps=3;
char str[]=' 1234 ab ';//4ab123
int len=strlen(str);
//printf('len=%d\n ',len);
printf('移动前:%s\n ',str);
rotateStrLeft(字符串、步骤、长度);
printf('移动后:%s\n ',str);
}
循环左右移结果相同条件
(1)字符串长度/2=偏移量
(2)测试结果(8/2=4)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。