在不断努力有效地摆弄比特的过程中(例如,参见这个SO问题),最新的挑战是比特的有效流和消费.
作为第一个简单的任务,我选择在生成的比特流中找到最长的相同比特序列/dev/urandom.典型的咒语是head -c 1000000 </dev/urandom | my-exe.实际目标是流式比特并解码Elias伽马码,例如,不是字节块或其倍数的码.
对于可变长度的这样的代码它是好的,具有take,takeWhile,group,对于列表操作等语言.由于a BitStream.take实际上会消耗部分b声,因此一些monad可能会发挥作用.
明显的起点是来自的懒惰字节串Data.ByteString.Lazy.
A.计算字节数
正如预期的那样,这个非常简单的Haskell程序与C程序相同.
import qualified Data.ByteString.Lazy as BSL
main :: IO ()
main = do
bs <- BSL.getContents
print $ BSL.length bs
Run Code Online (Sandbox Code Playgroud)
B.添加字节
一旦我开始使用unpack东西应该变得更糟.
main = do
bs <- BSL.getContents
print $ sum $ BSL.unpack bs
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,Haskell和C表现出几乎相同的表现.
C.相同位的最长序列
作为第一个非常重要的任务,可以找到最长的相同位序列,如下所示:
module Main where
import Data.Bits (shiftR, (.&.))
import qualified Data.ByteString.Lazy as BSL
import …Run Code Online (Sandbox Code Playgroud)