帮忙看下效率问题!

jncg66 2009-05-09 04:49:15
大家帮忙看下,下面这个函数的两种实际形式哪个好些?
我理解,第一个方法比较好:
1.不是在极端的情况下(n=1),第一个计算量少;
2.第一个没有循环过程,效率更高。

不知道这样理解对不?请高人指点!

unsigned rightrot(unsigned x, int n) /* 循环右移 */
{
int wordlength(void); /* 确定本机器中相应类型的位长度 */
unsigned rbit;

if ((n = n % wordlength()) > 0) {
rbit = ~(~0 << n) & x;
x = (x >> n) | (rbit << (wordlength() - n));
}
return x;
}

/*
unsigned rightrot(unsigned x, int n)
{
int wordlength(void);
unsigned rbit;

while (n-- > 0) {
rbit = (x & 1) << (wordlength() - 1);
x = x >> 1;
x = x | rbit;
}
return x;
}*/
...全文
154 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jncg66 2009-06-20
  • 打赏
  • 举报
回复
if ((n = n % wordlength()) > 0) { /* 需要移动位数n与机器长度wordlength比较后,得出需要移动的位数 */
rbit = ~(~0 < < n) & x; /* 根据前面计算得到的位数,把最右边的n位存到临时变量 */
x = (x >> n) | (rbit < < (wordlength() - n)); /* 移位并将之前的最右位,移进新数的左边 */
}
zhuyongjun 2009-05-11
  • 打赏
  • 举报
回复
if ((n = n % wordlength()) > 0) {
rbit = ~(~0 << n) & x;
x = (x >> n) | (rbit << (wordlength() - n));
}


能不能解释一下什么意思??
gaoyingie 2009-05-11
  • 打赏
  • 举报
回复
新手帮顶,应该是第一个吧
lpf000 2009-05-10
  • 打赏
  • 举报
回复
1
nicholasfly 2009-05-10
  • 打赏
  • 举报
回复
1
morris88 2009-05-10
  • 打赏
  • 举报
回复
第一种要好一些,不过 wordlength 应该是一个编译时常量,
并且 n 应该由调用者保证不会大于 wordlength 会更好一些吧...
npuhuxl 2009-05-10
  • 打赏
  • 举报
回复
没有循环比较好
koulongfei 2009-05-10
  • 打赏
  • 举报
回复
jncg66 2009-05-09
  • 打赏
  • 举报
回复
大家帮帮忙啊!
jncg66 2009-05-09
  • 打赏
  • 举报
回复
对,第一种方法没有循环,但一样达到了要求。

所以,我认为这种方法更有效率。
mengde007 2009-05-09
  • 打赏
  • 举报
回复
第一种貌似没有循环吧;就执行一次;

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧