C_and_CPP 板


LINE

用 template specialization 做 recursion 直接全展开, 连 runtime branch 都不会用到 乘法计算也是 compile time 用 template recursion, 不会有重覆计算的问题 若要用 runtime cache, 可以搭 local static variable 来做 cache 因为是 compiler 计算, 所以不论计算方法, 没有 performance 的问题, 不过这里还是用 binary shift-add 来计算, 只需要做乘数的 ones-bit 次数的shift-add 再利用 pop-count 取 ones 较少的值当乘数可减少 shift-add 的次数, 例如 8 * 7 = (8) + (8 << 1) + (8 << 2) 7 * 8 = (7 << 3) 整个99乘法表只要做 26 次 ADD (吧?) 有开 optimization, 应该编完是直接展开成 printf call leaq .LC1(%rip), %rsi movl $24, %r8d movl $6, %ecx movl $4, %edx movl $1, %edi xorl %eax, %eax call __printf_chk@PLT // printf ("%d x %d = %2d; ", 4, 6, 24); leaq .LC1(%rip), %rsi movl $28, %r8d movl $7, %ecx movl $4, %edx movl $1, %edi xorl %eax, %eax call __printf_chk@PLT // printf ("%d x %d = %2d; ", 4, 7, 28); --- https://paste.ubuntu.com/p/xXXfG9mrpR/ --- #include <algorithm> #include <cstdio> using namespace std; // wrapping an interger to a type for specialization template<int Y> struct int2type { int x; public: constexpr int2type(const int &_x = Y) { x = _x; } }; template<int X, int Y> constexpr int bitmax() { return (__builtin_popcount(X) >= __builtin_popcount(Y) ? X : Y); } template<int X, int Y> constexpr int bitmin() { return (__builtin_popcount(X) < __builtin_popcount(Y) ? X : Y); } class foo { // multiplication by bit shifting template<int Y> constexpr int __mul(int2type<Y> _x) { // should only be called 26 times. constexpr int z = __builtin_ffs(Y >> 1); return _x.x + __mul(int2type<(Y >> z)>(_x.x << z)); } constexpr int __mul(int2type<1> _x) { return _x.x; } template<int X, int Y> const int mul() { // compile time cache constexpr int z = __builtin_ffs(Y) - 1; return __mul(int2type<(Y >> z)>(X << z)); } public: foo () {} // print 99 tables recurrsively template<int X, int Y> void print(int2type<X> = int2type<X>(), int2type<Y> = int2type<Y>()) { print(int2type<X>(), int2type<Y - 1>()); printf ("%d x %d = %2d; ", X, Y, mul<bitmax<X, Y>(), bitmin<X, Y>()>()); } // print next table template<int X> void print(int2type<X> _x, int2type<0>) { print(int2type<X - 1>(), int2type<9>()); puts(""); } // recurrsion termination template<int Y> void print(int2type<0>, int2type<Y>) { } }; int main () { foo f; f.print<9, 9>(); } --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.42.119.18
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1532258157.A.966.html
1F:→ Killercat: 连int2type都出来了..... XD 07/22 21:47
2F:→ Killercat: modern c++ design也好几年没翻了(远目 07/22 21:47
3F:推 nowar100: 推 cole945 07/22 22:30
4F:→ nowar100: 下面给 LPH 接力 07/22 22:37
5F:→ cole945: 原本想把结果cache在class member才写的这麽恶搞.. 07/23 00:16
6F:→ cole945: 用class template就不会写这麽绕了XD cache拿掉忘了改 07/23 00:16







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP