Thanks to all.
On Friday, July 3, 2015 at 8:21:53 AM UTC-4, Jeffrey Sarnoff wrote: > > I wrote a range limited isa_leapyear(year) good in 1800..2200. > > Your look is appreciated; I do not understand this: > > The first version runs 50x more slowly than the second version. > The first is better practice, is there a way to make it behave? > > They differ only in placing the bit table (local vs const global). > I ran both through code_typed(), the function code is the same. > > this is the way of the snail: > > function is_proximal_leapyear(year::Int) > LeapYearBitTbl = > [ 0xfdfffffe, 0xffffffff, 0xfffff7ff, 0x0000000f ] > > y400 = convert(Uint32, year-1800) > y100 = y400 >> 2 > mask = one(Uint32) << (y100 & 0x0000000f) > indx = 1 + (y100 >> 5) > ((LeapYearBitTbl[indx] $ mask) + (y400 & 0x00000003)) === zero(Uint32) > end > > this way is lovely fast: > > const LeapYearBitTable = > [ 0xfdfffffe, 0xffffffff, 0xfffff7ff, 0x0000000f ]; > > function isa_proximal_leapyear(year::Int) > y400 = convert(Uint32, year-1800) > y100 = y400 >> 2 > mask = one(Uint32) << (y100 & 0x0000000f) > indx = 1 + (y100 >> 5) > ((LeapYearBitTable[indx] $ mask) + (y400 & 0x00000003)) === zero(Uint32) > end > >