64-битные целые числа представлены в Ruby MRI как Bignums внутри, даже в некоторых случаях на 64-битных платформах (из-за подробностей реализации Fixnums имеют длину всего 63 бит на 64-битной платформе и песок 31 бит на 32-битных платформах)).Следовательно, будет гораздо быстрее использовать двоичные операторы "и" &
:
ruby-1.9.2-p290 :001 > a = 2**128 + 1256231
=> 340282366920938463463374607431769467687
ruby-1.9.2-p290 :002 > a & (2 ** 64 - 1)
=> 1256231
ruby-1.9.2-p290 :003 > a & 0xffffffffffffffff
=> 1256231
Последний вариант немного уродливее, но и быстрее, поскольку в Ruby MRI отсутствуют постоянные папки.Если вы сделаете предложение 002
в цикле, оно будет вычислять 2**64 - 1
каждый раз.
Ruby MRI - это официальный ("реализация Matz Ruby") вариант Ruby, то есть "обычный"Рубин, который использует большинство из нас.Детали, которые я перечислил здесь, могут или не могут применяться таким образом к другим реализациям, но двоичное «и» обычно быстрее или быстрее, чем оператор по модулю на любой платформе или языке.