{{ message }}

Instantly share code, notes, and snippets.

# csuzw/DateDiff.cs

Last active Nov 13, 2017
Gets the number of days between 2 dates (at least if they fall between 01/01/0001 and 29/02/4096 (I think!)). Note that this could be even faster if I used such exotic things as conditionals to weed out the easy cases but where would the fun be in that!?!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
 public int DateDiff(int y1, int m1, int d1, int y2, int m2, int d2) { return GetDays(y2, m2, d2) - GetDays(y1, m1, d1); } private int GetDays(int y, int m, int d) { var y1 = y - 1; var m1 = m - 1; var yleap = y - ((18 - m) >> 4); var d4 = yleap >> 2; var d16 = yleap >> 4; return (y1 << 8) + (y1 << 6) + (y1 << 5) + (y1 << 3) + (y1 << 2) + y1 + ((m1 << 4) + (m1 << 3) + (m1 << 2) + (m1 << 1)) + ((m1 >> 1) - 1) - (((((m1 << 2) + m1) >> 5) - 1) & (m & 1)) + ((1 >> (m1 - 1)) << 1) + ((16 - m1) >> 4 << 1) + d4 - (((d4 << 5) + (d4 << 3) + d4) >> 10) + (((d16 << 5) + (d16 << 3) + d16) >> 10) + d; }

### csuzw commented Nov 13, 2017

`int a(int aͣ, int aͣͣ, int aͣͣͣ, int aͣͣͣͣ, int aͣͣͣͣͣ, int aͣͣͣͣͣͣ) => (((aͣͣͣͣ - 1) << 8) + ((aͣͣͣͣ - 1) << 6) + ((aͣͣͣͣ - 1) << 5) + ((aͣͣͣͣ - 1) << 3) + ((aͣͣͣͣ - 1) << 2) + (aͣͣͣͣ - 1) + (((aͣͣͣͣͣ - 1) << 4) + ((aͣͣͣͣͣ - 1) << 3) + ((aͣͣͣͣͣ - 1) << 2) + ((aͣͣͣͣͣ - 1) << 1)) + (((aͣͣͣͣͣ - 1) >> 1) - 1) - ((((((aͣͣͣͣͣ - 1) << 2) + (aͣͣͣͣͣ - 1)) >> 5) - 1) & (aͣͣͣͣͣ & 1)) + ((1 >> ((aͣͣͣͣͣ - 1) - 1)) << 1) + ((16 - (aͣͣͣͣͣ - 1)) >> 4 << 1) + ((aͣͣͣͣ - ((18 - aͣͣͣͣͣ) >> 4)) >> 2) - (((((aͣͣͣͣ - ((18 - aͣͣͣͣͣ) >> 4)) >> 2) << 5) + (((aͣͣͣͣ - ((18 - aͣͣͣͣͣ) >> 4)) >> 2) << 3) + ((aͣͣͣͣ - ((18 - aͣͣͣͣͣ) >> 4)) >> 2)) >> 10) + (((((aͣͣͣͣ - ((18 - aͣͣͣͣͣ) >> 4)) >> 4) << 5) + (((aͣͣͣͣ - ((18 - aͣͣͣͣͣ) >> 4)) >> 4) << 3) + ((aͣͣͣͣ - ((18 - aͣͣͣͣͣ) >> 4)) >> 4)) >> 10) + aͣͣͣͣͣͣ) - (((aͣ - 1) << 8) + ((aͣ - 1) << 6) + ((aͣ - 1) << 5) + ((aͣ - 1) << 3) + ((aͣ - 1) << 2) + (aͣ - 1) + (((aͣͣ - 1) << 4) + ((aͣͣ - 1) << 3) + ((aͣͣ - 1) << 2) + ((aͣͣ - 1) << 1)) + (((aͣͣ - 1) >> 1) - 1) - ((((((aͣͣ - 1) << 2) + (aͣͣ - 1)) >> 5) - 1) & (aͣͣ & 1)) + ((1 >> ((aͣͣ - 1) - 1)) << 1) + ((16 - (aͣͣ - 1)) >> 4 << 1) + ((aͣ - ((18 - aͣͣ) >> 4)) >> 2) - (((((aͣ - ((18 - aͣͣ) >> 4)) >> 2) << 5) + (((aͣ - ((18 - aͣͣ) >> 4)) >> 2) << 3) + ((aͣ - ((18 - aͣͣ) >> 4)) >> 2)) >> 10) + (((((aͣ - ((18 - aͣͣ) >> 4)) >> 4) << 5) + (((aͣ - ((18 - aͣͣ) >> 4)) >> 4) << 3) + ((aͣ - ((18 - aͣͣ) >> 4)) >> 4)) >> 10) + aͣͣͣ);`