Про биты
This commit is contained in:
@@ -240,6 +240,30 @@ decryptCaesar alphabet shift =
|
||||
\end{lstlisting}
|
||||
|
||||
|
||||
\subsection{Представление текста в виде последовательности бит}
|
||||
|
||||
Код функций для преобразования текста в последовательность бит и обратно представлен в листинге~\ref{lst:bit}. Функция \texttt{textToBits} принимает текст в виде строки и возвращает его представление в виде вектора бит. Она использует вспомогательную функцию \texttt{charToBits}, которая преобразует символ в список бит, представляющих его код ASCII в двоичном виде. Для преобразования последовательности бит обратно в текст используется функция \texttt{bitsToText}. Она рекурсивно делит вектор бит на блоки по 8 бит, преобразует каждый блок в символ ASCII и объединяет их в строку. В процессе этого преобразования используется функция \texttt{bitsToInt}, которая преобразует вектор бит в целое число, интерпретируя их как двоичное представление этого числа.
|
||||
|
||||
|
||||
\begin{lstlisting}[caption={Функции для конвертации текста в последовательность бит и обратно.}, label={lst:bit}]
|
||||
textToBits :: String -> VU.Vector Int
|
||||
textToBits text = VU.fromList $ concatMap charToBits text
|
||||
|
||||
charToBits :: Char -> [Int]
|
||||
charToBits c = [if testBit (ord c) i then 1 else 0 | i <- [7,6..0]]
|
||||
|
||||
bitsToText :: VU.Vector Int -> String
|
||||
bitsToText bits
|
||||
| VU.null bits = []
|
||||
| otherwise = (chr $ bitsToInt (VU.take 8 bits)) : bitsToText (VU.drop 8 bits)
|
||||
|
||||
bitsToInt :: VU.Vector Int -> Int
|
||||
bitsToInt bits =
|
||||
sum [bit * (2 ^ index) | (bit, index) <- zip (VU.toList bits) [len,(len - 1)..0]]
|
||||
where
|
||||
len = VU.length bits - 1
|
||||
\end{lstlisting}
|
||||
|
||||
\newpage
|
||||
\section {Результаты работы программы}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user