使用位级操作实现不同形式右移之间的转换

在计算机程序设计中有三种形式的右移:逻辑右移、算术右移和循环右移。如何仅使用位级操作实现不同类型右移操作之间的转换?<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

禁止使用:

l  条件语句(if 或者 ?:)、循环、分支语句、函数调用和宏调用。

l  除法、模运算和乘法。

l  相对比较运算符(<><=>=)。

l  强制类型转换,无论是显式的还是隐式的。

 

函数srl用算术右移来完成逻辑右移,函数sra使用逻辑右移完成算术右移,函数srr使用逻辑右移完成循环右移。

 

int sra(int x, int k)

{

  /* Perform shift logically*/

  int xsrl = (unsigned) x >> k;

  int w = sizeof(int)<<3;

  ((1<<(w-1)) & x) && (xsrl |= (-1<<(w-k)));

  return xsrl;

}

 

int srl(int unsigned x, int k)

{

  /* Perform shift arithmetically */

  unsigned xsra = (int)x >> k;

  int w = sizeof(int)<<3;

  return xsra & ~(-1<<(w-k));

}

 

/* Do rotating right shift. Assume 0 <= n < w

 * Example when x = 0x12345678 and w = 32;

 * n=4 -> 0x81234567, n=20 -> 0x45678123

 */

int srr(unsigned x,int n)

{

  int w = sizeof(int)<<3;

  for(int i=0; i<n; ++i)

  {

     x = (x>>1)|(x<<(w-1));

  }

  return x;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值