c语言2字节循环左移,C语言中关于循环左移和循环右移

昨天在解答同学的问题中,又接触了好久没碰的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。所以我们要解决的就是如何补回溢出的。

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

3379f9cfd2d3?utm_campaign=maleskine

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

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

3.这里实现的关键是要对溢出的进行补偿,不妨这样想象,<

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值