利用位运算求一个月的天数
先上代码:
1 int month(int n) { 2 n = (n / 8 + n % 2) % 2 + 30 - 2|(n - 2); 3 4 return n; 5 }
计算思路:
下面是每个月的天数分布。
// 1 2 3 4 5 6 7 8 9 10 11 12
// 每个月:31 28 31 30 31 30 31 31 30 31 30 31
所以完全可以使用 30 作为基数。2月单独进行计算。从8月份进行分割,8月之前,1 0 1 0 1 0 1 。8月之后 0 1 0 1
先除 8 ,小于8 的全部为 0 ,再对2 取模,单数天为 1 . 双数天为 0 .
带入运算:n = 12 ; n / 8 = 1; n %2 = 0; 1 %2 = 1; 1 + 30 = 31。
31 - 2 = 29; 29 | 10 = 31;
得到结果: 31
| 位运算,位或。二进制对应位如果同为零,则为零,其他为1。