にしむくさむらい
西向く士: 2 4 6 9 11
✊の方法
4+3でちょうど7と8の間で折り返しになる
偶奇と切り替わりの8で特徴づける
table:month
1 2 3 4 5 6 7 8 9 10 11 12
mod2 1 0 1 0 1 0 1 0 1 0 1 0
div8 0 0 0 0 0 0 0 0 1 1 1 1
isbig 1 0 1 0 1 0 1 1 0 1 0 1
code:jl
months = collect(1:12)
is_31days(m) = m % 2 != m ÷ 8
is_31days_another(m)::Bool = (m & 1) ⊻ (m >> 3)
m & 1 ^ m >> 3
で求まることが分かりました。30年前のコンピュータでもきっと高速
& 1
mod2
@yoiwa_j: 30年前だと1995年、Pentiumくらいか。この時代ならシフトは定数時間だから、これか (0x15AA >> m) & 1 のどっちかかな。 45年前だとバレルシフタないだろうから、m >> 3 と !!(m & 8) はどっちが速いかなあ。
(Z80 のビット命令は可変指定ができない)
0b1010_1011_0101が仕込まれたマジックナンバーを持っておけばよい
0x15aa = 0b0001_0101_1010_1010
$ (m -> (0x15aa >> m) & 1).(collect(1:12))