利用位运算求一个月的天数

先上代码:

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。

 

posted @ 2016-02-23 08:42  Chenstyle  阅读(238)  评论(1编辑  收藏  举报