软件乘法
2015-07-09 10:15
337 查看
#include <stdint.h> #include <stdbool.h> uint64_t _soft_umul_bad(uint32_t a, uint32_t b) { uint64_t ret = 0; int i, j; for (i = 0; i < sizeof(a)*8; i++) for (j = 0; j < sizeof(b)*8; j++) { ret += (uint64_t)((a & (1 << i)) && (b & (1 << j))) << (i + j); } return ret; } uint64_t _soft_umul(uint32_t a, uint32_t b) { uint64_t ret = 0, shift; int i; shift = b; for (i = 0; i < sizeof(b)*8; i++) { if(a & (1 << i)) { ret += shift; } shift <<= 1; } return ret; } int64_t _soft_mul(int32_t a, int32_t b) { bool neg_a, neg_b, neg_re; int64_t ret; neg_a = (a < 0); neg_b = (b < 0); neg_re = neg_a ^ neg_b; a = neg_a ? (-a) : (a); b = neg_b ? (-b) : (b); ret = (int64_t)_soft_umul((uint32_t)a, (uint32_t)b); return neg_re ? (-ret) : (ret); } #include <stdio.h> int main(int argc, char *argv[]) { int32_t a, b; int64_t re_soft, re; if (argc != 0) { fprintf(stderr, "softmul [num1] [num2]\n"); return -1; } sscanf(argv[1], "%d", &a); sscanf(argv[2], "%d", &b); re = (int64_t)a * b; re_soft = _soft_mul(a, b); printf("a = %d, b = %d\n", a, b); printf("re = %lld, re_soft = %lld\n", re, re_soft); return 0; }
相关文章推荐
- MVC 简单的POST局部刷新
- Android Studio 发生 Couldn't load jpush175 from loader dalvik.system.PathClassLoader 异常
- python做一个http接口测试框架
- 移动负载均衡技术(MBL)
- Python 网页爬虫 & 文本处理 & 科学计算 & 机器学习 & 数据挖掘兵器谱
- php中错误和异常处理的机制二(错误处理器和错误触发器)
- 交错字符串——动态规划
- 闭包,懂不懂由你,反正我是懂了
- shell 脚本的执行
- CodeForces 3C Tic-tac-toe 井字棋盘游戏
- poj 3461 Oulipo(KMP)
- dojo学习网址
- qt 的ui界面设计师中的布局 控件QWidget中使用的布局
- android避免decodeResource图片时占用太大的内存
- 本地访问Linux服务器web运用的hosts配置简单例子---兰
- 手游-放开那三国socket协议分析
- ECNUOJ 2144 抗震机械制造
- value equality vs. object equality, aliasing, list is mutable DEMO
- 给微商翻案 一个150人的生意有得玩
- hibernate插入中文到mysql数据库乱码