您的位置:首页 > 其它

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

2011-11-03 20:23 357 查看
在计算机程序设计中有三种形式的右移:逻辑右移、算术右移和循环右移。如何仅使用位级操作实现不同类型右移操作之间的转换?<?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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: