求余运算转换为位运算
2015-11-30 18:17
357 查看
因为求余运算要用到除法,除法是比较费时的。因此高性能的程序需要对求余进行转换。
如果被求余数是2的整数次幂,可以用位运算来进行转换,从而得到比较高的效率。
例如求 n % 32 = ???
可以将其转换为 n & (32-1)
或者 n - (n>>5)<<5
证明比较简单,只要把n表示为二进制即可一目了然。
这个转换用处之一就是位向量的实现。
如下:
enum {BITSPERWORD=32, SHIFT=5, MASK = 0x1F};
void set(int i) { x[i>>SHIFT] |= (1<<(i & MASK)) ;} // 这里用到了求余的转换,实际是i % 32
void clr(int i) { x[i>>SHIFT] &= ~(1<<(i & MASK)); }
bool test(int) { return x[i>>SHIFT] & (1<<(i & MASK)); }
to be continued...
如果被求余数是2的整数次幂,可以用位运算来进行转换,从而得到比较高的效率。
例如求 n % 32 = ???
可以将其转换为 n & (32-1)
或者 n - (n>>5)<<5
证明比较简单,只要把n表示为二进制即可一目了然。
这个转换用处之一就是位向量的实现。
如下:
enum {BITSPERWORD=32, SHIFT=5, MASK = 0x1F};
void set(int i) { x[i>>SHIFT] |= (1<<(i & MASK)) ;} // 这里用到了求余的转换,实际是i % 32
void clr(int i) { x[i>>SHIFT] &= ~(1<<(i & MASK)); }
bool test(int) { return x[i>>SHIFT] & (1<<(i & MASK)); }
to be continued...
相关文章推荐
- phpstorm常用快捷键
- Servlet 实现动态图文结合输出
- Shell之预启动脚本
- P-MOS管做开关管用
- 从SUMO的输出文件中获得队列转移矩阵
- 黑马程序员——OC学习——类方法和匿名类
- 各类服务器远程管理卡配置
- Linux NFS服务器的安装与配置
- 纯后处理的volumetric light
- USG双击热备配置
- 如何解决netty发送消息截断问题
- 项目技术杂谈
- 七个你无法忽视的 Git 使用技巧
- Android---MVP设计模式高级(三)
- 移植USB无线网卡到mini2440(TP-LINK的TL-WN721N,使用的芯片型号是rtl8192cu)
- caogao
- HDU2004---成绩转换
- ListView实现翻页和不同行有不同布局
- Android---MVP设计模式中级(二)
- Java Servlet 技术简介