C语言正数和负数循环右移,左移,把某正数的第m位(从0开始)到n位取反

问题:从键盘输入一个整型数(int型),然后再输入一个正整数m,把第一个数循环右移m位后输出;

int类型占用32位。第一位为符号位,1则为负数,0为正数。

>>往右移动,右边的丢弃,如果是正数,则左边补0,如果是负数则补1.

<<往左移动,每次移动补0

循环右移指的是移动到右边的不丢弃,而是在第一位出现。循环

负数的循环右移思想是往左移动32-x位。(x表示要右移的位数),因为要往左移,所以补0.又负数其他位都为1,故生成32-x个1与左移自动补的0进行|运算,目的是让补的位置为1,相关代码如下:

int number,index; //number:要进行右移的数字,index表示移动的位数
    scanf("%d%d",&number,&index);
    if(number >= 0){
            printf("%d",((number&((0<<9)+(int)pow(2, index)-1))<<index)+(number>>index));
    }
    else{
        printf("%d",(number << (32-index))|((int)pow(2, 32-index)-1));
    }

============================================================================

今天发现了更简单的方法

printf("right move: %d\n",number>>index|(number<<(32-index)));
printf("left move: %d",number << index | (number << (32 - index)));
把x的第m位(从0开始)到第n位取反
(~(x >> m)&((int)pow(2,(n-m+1))-1))<<m|(x & ((int)pow(2,(n-m+1))-1)));


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值