C语言什么是循环移位?

一、问题

左移位是将⼆进制位的数据向左移动,移动位数由移位运算符右侧的⼗进制整数决定。向右移位与向左移位相似,只是⽅向不同。那什么是循环移位?

二、解答

循环移位就是在移位的过程中,不丢失移位前原操作数的位,⽽是将移出的⼆进制位数据写⼊需要补位的位置。循环移位的结果如下所示。

下⾯举例说明循环移位的过程。例如,要求将⼗六进制数 a 进⾏左循环移位。为实现循环左移,有如下算法步骤。

(1)将 a 的左端 n 位先放到 b 中的低 n 位。可以⽤如下语句实现。

cpp 复制代码
b=a>>(16-n);

(2)将 a 左移 n 位,其左⾯低 n 位补 0 。可以⽤如下语句实现。

cpp 复制代码
c=a<<n;

(3)将c与b进⾏按位或运算。即:

cpp 复制代码
c=c|b;

这样就实现了循环左移。循环右移可以采⽤同样的思想。

说明:

在进⾏移位运算时,采⽤⼗六进制数更能清晰地观察出变化。

⽤⼗六进制数实现循环左移的实例程序如下。

cpp 复制代码
mian()
{
    unsigned a, b, c, n, z;
    scanf("a=%x,n=%d", &a, &n);
    b = a >> (16 - n);
    printf("b=%x\n", b);
    c = a << n;
    printf("c=%x\n", c);
    z = c | b;
    printf("z=%x\n%x\n", a, z);
}

程序运⾏结果如下所示。

cpp 复制代码
a=0001,n=3
b=0
c=8
1
8

三、总结

在循环移位的算法步骤中,重要的是要理解(3)的或运算,按位或运算可以使得到的 z 保持 b 的⾼位和 c 的低位均不变。

相关推荐
Navigator_Z22 分钟前
LeetCode //C - 1248. Count Number of Nice Subarrays
c语言·算法·leetcode
是隼人44 分钟前
buuctf-pwn picoctf_2018_shellcode(ret2shellcode)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
潜创微科技1 小时前
IT6520:USB-C 转 MIPI 高集成控制器,DP 1.4a 转 MIPI 单芯片搞定 4K120 显示
c语言·开发语言·低延迟·掌机·联阳
Escalating_xu1 小时前
【System V 信号量】从 P/V 原语到 Builder 封装:写出可控、可清理的进程互斥组件
java·linux·开发语言·jvm
傲世仙尊2 小时前
System V 进程间通信详解:共享内存、消息队列与信号量(CSDN博客)
linux·开发语言·c++
cvby2 小时前
C++11
开发语言·c++
白色的北极熊2 小时前
字符转 ASCII 码
c语言
ch.ju3 小时前
Java—idea知识:如何创建新项目
java·开发语言·intellij-idea
Evand J3 小时前
【MATLAB例程,图像滤波降噪12】加权中值滑动窗口滤波(WMF)图像降噪,包含滤波质量评价。附代码下载链接
开发语言·图像处理·人工智能·计算机视觉·matlab·滑动窗口·滤波
Tairitsu_H3 小时前
[C++] C++11类和STL的新特性
开发语言·c++·stl·c++11