def f1(n) n = ((n >> 0) & 0b11) + ((n >> 2) & 0b11) + ((n >> 4) & 0b11) + ((n >> 6) & 0b11) + 0 n = ((n >> 0) & 0b11) + ((n >> 2) & 0b11) + ((n >> 4) & 0b11) + ((n >> 6) & 0b11) + 0 n = ((n >> 0) & 0b11) + ((n >> 2) & 0b11) + ((n >> 4) & 0b11) + ((n >> 6) & 0b11) + 0 n == 3 ? 0 : n end def f2(n) n = ((n >> 0) & 0b11) + ((n >> 2) & 0b11) + ((n >> 4) & 0b11) + ((n >> 6) & 0b11) + 0 n = ((n >> 0) & 0b11) + ((n >> 2) & 0b11) + 0 n = ((n >> 0) & 0b11) + ((n >> 2) & 0b11) + 0 n == 3 ? 0 : n end def f3(n) n = ((n >> 0) & 0b1111) + ((n >> 4) & 0b1111) + 0 n = ((n >> 0) & 0b11) + ((n >> 2) & 0b11) + ((n >> 4) & 0b11) + 0 n = ((n >> 0) & 0b11) + ((n >> 2) & 0b11) + 0 n == 3 ? 0 : n end 256.times do |n| expected = n % 3 actual = f3(n) if actual != expected puts "#{actual} != #{expected} (#{n}; #{"%08b" % n})" end end