sao*_*lof 1 assembly date micro-optimization
用于标准库不可用的情况。假设月份是一个无符号整数。
我很想看到给出正确答案的最短算术表达式,允许或禁止按位运算符和掩码,但不允许查找表。部分表达式可以保存到变量中以提高可读性以展示所使用的想法。
这是一种仅使用四个简单算术和按位操作以及一个 26 位常量的方法:
int days_in_month(unsigned m) {
// 121110 9 8 7 6 5 4 3 2 1 0
return 28 + ((0b11101110111110111011001100u >> m * 2u) & 0b11);
}
Run Code Online (Sandbox Code Playgroud)
如果您还想处理闰年(问题中没有提及),您可以采用类似的方法,代价是多一些操作和一个 50 位常量:
int days_in_month2(unsigned m, bool ly) {
return 28 + ((0b11101110111110111011011111101110111110111011001100u >> (m + 12*ly) * 2u) & 0b11);
}
Run Code Online (Sandbox Code Playgroud)
如果您愿意以不同的方式传递闰年,例如设置有点像month | 16表示闰年,它会更有效。
我假设您将月份传递为 1 到 12,而不是 0 到 11。
测试和生成的 asm 可以在 Godbolt 上看到。