使用位级操作实现不同形式右移之间的转换
来源:互联网 发布:图书管理系统数据字典 编辑:程序博客网 时间:2024/05/31 18:39
在计算机程序设计中有三种形式的右移:逻辑右移、算术右移和循环右移。如何仅使用位级操作实现不同类型右移操作之间的转换?<?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(intunsigned 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;
}
- 使用位级操作实现不同形式右移之间的转换
- 使用boost库实现不同数据类型之间的自由转换
- 使用位段实现整数的二进制形式输出
- 无刷新实现不同货币值之间的转换
- 不同坐标系之间的转换
- warning C4407: 在指向成员表示形式的不同指针之间进行转换,编译器可能生成不正确的代码
- warning C4407: 在指向成员表示形式的不同指针之间进行转换,编译器可能生成不正确的代码
- warning C4407: 在指向成员表示形式的不同指针之间进行转换,编译器可能生成不正确的代码
- 带进位的右移
- 不同字符集之间的操作
- 不同数据库之间的操作
- 关于位运算的操作以及不同进制数之间的比较
- 右移操作c++实现
- 使用类的重载实现不同数据类型之间的运算
- 位操作——循环右移n位
- 使用COM方式实现不同语言之间的调用
- 不同字符集之间的编码转换
- 不同数字类型之间的转换
- 上百部BBC经典纪录片在线欣赏
- min-height最小高度的实现(兼容IE6、IE7、FF、Chrome)
- 金庸教你谈恋爱[这个写的太牛逼了,加上了天龙八部,感谢原作者]
- cocos2d-x 使用setTextureRect的问题
- linux中解析命令行参数
- 使用位级操作实现不同形式右移之间的转换
- RandomAccessFile 多线程的文件复制
- 视频终于可以传了,happy下
- dataset 和强类型dataset 比较
- c/c++学习50个好网站
- vc++调色板!!!
- jquery 新闻轮换 插件及使用方法
- 迎接2012之运算符重载、强类型转换、委托和事件
- Csharp 简单操作Word模板文件