使用位级操作实现不同形式右移之间的转换
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;
}
/>
禁止使用:
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;
}
相关文章推荐
- 生动讲解使用不同方式操作File文件的方法之间的差异
- 使用Gson或者GsonBuilder实现JSON和Java对象之间的转换
- 使用XStream实现xml与JavaBean之间的转换
- NHibernate利用Mindscape.NHibernateModelDesigner实现数据库与实体之间的转换及操作
- Android中实现滑动翻页—使用ViewFlipper(dp和px之间进行转换)
- 使用impdp实现数据在不同用户、不同实例之间快速复制
- 使用JAVA 实现jpg/tif/bmp 等图片之间格式得互相转换
- 使用java语言实现进制之间的相互转换
- Android中实现滑动翻页—使用ViewFlipper(dp和px之间进行转换)
- 如何使用QString把不同类型的数据如何转换成字符串形式输出
- boost-使用format和lexical_cast实现数字和字符串之间的转换
- NHibernate利用Mindscape.NHibernateModelDesigner实现数据库与实体之间的转换及操作
- Android使用typeface实现不同字体的调用显示及String转换为Unicode
- 使用stringstream实现数字到字符串之间的转换
- 使用COM方式实现不同语言之间的调用
- powerdesigner 使用实体的快捷方式实现不同package之间的实体关系引用
- warning C4407: 在指向成员表示形式的不同指针之间进行转换,编译器可能生成不正确的代码
- 使用反射,实现简单的JSON与Bean之间的转换
- 使用反射+缓存+委托,实现一个不同对象之间同名同类型属性值的快速拷贝
- 使用AutoMapper实现Dto和Model之间自由转换