N=28+!(DY MOD 4)&&!!(DY MOD 100)||!(DY MOD 400)
も間違えていました。
正しくは
N=28+(!(DY MOD 4)&&!!(DY MOD 100)||!(DY MOD 400))
です。
ちなみに
&&と*は似たような意味を持つことがあるので
N=28+!(DY MOD 4)*!!(DY MOD 100)+!(DY MOD 400)
と書くことが出来ます。
なんとなく解説
あの式は
IF DY MOD 4==0&&DY MOD 100!=0||DY MOD 400==0 THEN
N=29
ELSE
N=28
ENDIF
の短縮形で
N=28+(!(DY MOD 4)&&!!(DY MOD 100)||!(DY MOD 400))
を複雑化したような式です。
ちなみに&&や!は言語によっては+や*と型が違うためエラーが出ます。
閏年判定を短く記述したいのであればN=28+!(DY MOD 4)-!(DY MOD 100)+!(DY MOD 400)なんてどうでしょうか?
閏年に関しては西暦が「4で割り切れる」「100で割り切れる」「400で割り切れる」という3つの条件を考える必要があります。
4で割り切れない、100で割り切れない、400で割り切れない→閏年ではない
4で割り切れる、100で割り切れない、400で割り切れない→閏年
4で割り切れる、100で割り切れる、400で割り切れない→閏年ではない
4で割り切れる、100で割り切れる、400で割り切れる→閏年
実は、3つの条件は独立したものではなく「4で割り切れる数の集合⊃100で割り切れる数の集合⊃400で割り切れる数の集合」という包含関係になっています。
(続く)
したがって、「4で割り切れない、100で割り切れる」ということはあり得ないためこの4通りの判定が行えれば良いことは分かると思います。
この4つの判定を見ると3つの条件のうち1つの条件もしくは3つの条件を満たせば閏年になり、条件をすべて満たさないもしくは2つ満たした場合には閏年にはならないことも分かると思います。
ここまでくればあとは「3つの条件のうち1つの条件もしくは3つの条件を満たす」というのをいかに簡略化できるかにかかってきます。
4で割り切れるというのはDY MOD 4==0と記述できますが、これは他の方も書いているように!(DY MOD 4)に置き換えることができます。
それと包含関係を考慮した場合にN=28+!(DY MOD 4)-!(DY MOD 100)+!(DY MOD 400)がある年(DY)における2月の日数になるというわけです。
(続く)
例えば1900年だと「100で割り切れる」という条件を満たすため!(DY MOD 100)の値は1になりますが、それと同時に「4で割り切れる」という条件も満たすため!(DY MOD 4)の値も1になります。したがって、!(DY MOD 4)-!(DY MOD 100)の値は1-1=0でとなり、28+0=28(閏年ではない)となるわけです。
「論理値 OR 論理値」は「論理値+論理値」で代用(短縮化)というのはよく目にしますが「論理値-論理値」というのは「論理値 XOR 論理値」を代用したものと言えます。
とはいえ、内蔵時計から読み出した日付のみを使うのであればN=28+!(DY MOD 4)で1901年から2099年までカバーできるため個人的にはこれでも十分だと思います。