にしむくさむらい
from 暦
西向く士: 2 4 6 9 11
✊の方法
4+3でちょうど7と8の間で折り返しになる
/villagepump/月の日数の覚え方
偶奇と切り替わりの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)
small = 2, 4, 6, 9, 11
big = 1, 3, 5, 7, 8, 10, 12
is_31days(m) = m % 2 != m ÷ 8
monthsis_31days.(months) == big
is_31days_another(m)::Bool = (m & 1) ⊻ (m >> 3)
monthsis_31days.(months) == monthsis_31days_another.(months)
@csharpVtuber: @yuki_arano is31Days = m%2 != m/8;
@yuki_arano: 色々話した結果
m & 1 ^ m >> 3
で求まることが分かりました。30年前のコンピュータでもきっと高速
& 1
mod2
AND演算は剰余の演算
@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))