c程序设计语言 库,《C程序设计语言》 练习2-8

问题描述

练习 2-8 编写一个函数rightrot(x, n),该函数返回将x循环右移(即从最右端移出的位将从最左端移入)n(二进制)位后所得到的值。

Write a function rightrot(x,n) that returns the value of the integer x rotated to the right by n bit positions.

解题思路

这个题目我感觉可以有两种理解方式

第一种

就是默认二进制位数,前面没有多余的0来补位,比如111的二进制是1101  111,我就认为题目的函数对1101  111进行循环右移,就是把最右端的数字放到最左端,即 1101  111

第二种

这一种理解方式是比较符合实际的,就是计算机中二进制数位是有规定的,比如有的计算机是32位

那么111的二进制就不是1101  111了,而是

0000  0000 0000 0000 0000 0000 0110 1111(在前面补了25位0,对数值大小无影响)

那么我们把最右端的一个数字放到最左端就是1000  0000 0000 0000 0000 0000 0110 111结果显然与第一种不同

思路一代码:

#include

int rightrot(unsigned int x , int n)

{

int k,i;

int ribits;

k = x;

for ( i = 0; k!=0; i++)//算出x二进制形式有多少位

{

k=k>>1;

}

ribits = (~(~0<

x = (x>>n) | ribits;

return x;

}

int main()

{

printf("%d",rightrot(111,3));

return 0;

}

运行输出

%E5%A4%96%E9%93%BE%E7%BD%91%E5%9D%80%E5%B7%B2%E5%B1%8F%E8%94%BD

思路二代码

#include

unsigned rightrot(unsigned x, unsigned n)

{

while (n > 0) {

if ((x & 1) == 1)

x = (x >> 1) | ~(~0U >> 1);//U表示无符号,相当于unsigned

else

x = (x >> 1);

n--;

}

return x;

}

int main()

{

printf("%d",rightrot(111,3));

return 0;

}

运行结果

%E5%A4%96%E9%93%BE%E7%BD%91%E5%9D%80%E5%B7%B2%E5%B1%8F%E8%94%BD

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值