美文网首页程序员
C语言中关于循环左移和循环右移

C语言中关于循环左移和循环右移

作者: KeyKeyKey | 来源:发表于2016-10-16 09:58 被阅读0次

       昨天在解答同学的问题中,又接触了好久没碰的C中的位操作。在重接触的过程中,又理解了一遍计算机存储数据的细节,于是分享给大家看一下。

让我们先看一下题目:编写一个程序,输入两个整数i、j,如果j的值大于0,则将i循环左移j位;

如果j的值小于0,则将i循环右移j位,最后输出i的值。

输入输出格式要求:

输入格式:i j回车

i j 均用int类型存储。

只输出运算结果,请不要输出其他字符

例如:

输入:3 10回车

输出:3 3072

输入:-65535 -2回车

输出:2147467264

首先,我们要明确<<和>>移位操作是会溢出的,比如01111100,左移三位后为11100000,它的1的个数是会减少的。

而循环左移得到的应为11100011。所以我们要解决的就是如何补回溢出的。


为了节约大家时间,先贴代码,如果看懂 下面就不用细看了。

1.注意格式要求输入int类型,但是有符号整数的右移补位,如果是负数,根据编译系统的不同既有可能是算术右移,也有可能是逻辑右移,即补偿的有可能是0,也有可能是1。所以要化成无符号整数,进行运算。

2.有可能输入的j大于int的位数,这里即为32。所以要进行越界检查。

3.这里实现的关键是要对溢出的进行补偿,不妨这样想象,<<操作即是把整数当成队列,左右两边补上无数个0,我们能看到的只有这32位.。而循环左移则是把整数当成一个32位长的环,于是解决方法自然应运而生。

那就是|上相反的位移操作32-j位。因为是一个环,所以左移n位就是右移(长度-n)位。这样溢出的就会有相应补偿。

4.最后要记得化为int类型。


相关文章

  • C语言中关于循环左移和循环右移

    昨天在解答同学的问题中,又接触了好久没碰的C中的位操作。在重接触的过程中,又理解了一遍计算机存储数据的细节,...

  • C语言左移和右移

    C语言中左移表示左移运算符,就是把最高位丢弃掉然后在最低位补0;而C语言中的右移就是右移运算法,与左移是相反的,它...

  • 8086/8088 移位指令解释

    目录 非循环移位1.1 逻辑左移——SHL1.2 逻辑右移——SHR1.3 算术左移——SAL1.4 算术右移——...

  • 将数组元素循环移动p位,交换次数仅为n次

    算法思路 循环左移p位 数组序列长度为n,左移p位。 算法步骤 代码如下: 循环左移p位 数组序列长度为n,右移p...

  • Swift学习Day2-----循环和条件语句

    一、循环语句 1.for循环 1)For-Condition-Increment条件循环,和c语言中的一样,例如:...

  • 16_位运算符分析

    关键词: C语言中的位运算符、 左移和右移注意点、位运算防错准则、 位运算符和逻辑运算符的区别 1. C语言中的位...

  • 02-C语言流程控制-循环结构

    循环结构 C语言中提供了三大循环结构,分别是while, do - while 和 for; while循环 特点...

  • 每天学一点 Kotlin -- 控制流:循环

    1. 介绍 1.1 Kotlin 支持其他语言中常见的两种循环:while 和 for 循环。while 循环的语...

  • 关于测试左移和右移

    看到我们论坛一个测试开发知识体系,对于测试左移和右移, 有点不太懂,看了2篇文章,强行提笔总结了下,还有部分内容是...

  • day7-函数

    1.函数的作用 左移、右移、发射子弹 ---左移-右移-左移-左移-右移-右移--- 没有函数的时候,问题在哪儿?...

网友评论

    本文标题:C语言中关于循环左移和循环右移

    本文链接:https://www.haomeiwen.com/subject/azvoyttx.html