-
Напоминалка, для тех кто не помнит, что такое двоичная система (переводить лень):
A number 23 in base 10 notation can be understood
as a linear combination of powers of 10:
The rightmost digit gets multiplied by 100 = 1
The next number gets multiplied by 101 = 10
…
The n*th number gets multiplied by 10^(n-1)*.
All these values are summed.
So: 23 => 2*10^1 + 3*10^0 => 2*10 + 3*1 = 23 base 10
Binary is similar, but uses powers of 2 rather than powers of 10.
So: 101 => 1*2^2 + 0*2^1 + 1*2^0 => 1*4 + 0*2 + 1*1 => 4 + 1 => 5 base 10.
Зачем это мне, просто я заметил, что русскоязычная аудитория всегда пишет эффективный алгоритм, а не русскоязычная что только не выдумывает (многие)♡ recommended by @juick
Replies (28)
-
@NokitaKaze, ну будет и что? Как реализуешь, так и хорошо, не в этом соль, можешь большие числа — реализуй любое, не можешь то word64/word32 на усмотрение.
-
@NokitaKaze, на самом деле на язык и код — пофиг, даже описание алгоритма или псевдокод подходит.
-
@qnikst, Описание: 1. Берём каждые 8 символов с конца и получаем байт. Делаем, пока не наберём все байты. Все байты являют собой одно огромное число.
2. Делим на 10, остаток от деления цифра. Повторяем деление на десять пока не закончится само число
Это то, что реализуем быстро -
@NokitaKaze, норм, учитывая то, как я написал /0. Вообще меня интересовала чать 1: как именно делаем берём 8 символов с конца и получаем байт.
-
@qnikst, substr($s, -8); вот так берём,
for ($i=0;$i<8;$i++){
$j = $j | ( (int)$s[$i] shr (7-$i));
}
как-то так -
@fmap, По одному или по восемь, смотря что считать итерацией. Если бы я знал систему команд модных процов, может быть чего повеселее высрал.
-
@Annoynimous, Если по восемь, то как ты будешь 64 битные результы масок упаковывать в 8 бит?
-
@fmap, Вот в "умных" алгоритмах я упёрся в ту же проблему. Поэтому я использовал тупой вариант с делением