2015-12-07 2 views
2

Essayer de convertir une liste de bits (0,1) dans un Int8 ou quelque chose de similaire pour que je ne suis pas en train de perdre un octet de ByteString sur seulement 1 bitbits Convertir à Int8 Haskell

Par exemple, je peux avoir une liste comme [0,1,0,0,0,1,1,1,1,0], qui en ByteString représente chacun de ceux-ci comme un octet au lieu d'un bit.

Répondre

3

Une solution serait de plier un peu plus de la liste:

import Data.Bits (Bits, shiftL, (.|.)) 

pack :: (Num b, Foldable t, Bits b) => t b -> b 
pack a = foldl go 0 a 
    where go acc i = (acc `shiftL` 1) .|. i 

et vous obtenez:

\> pack [0,1,0,0,0,1,1,1,1,0] 
286 
+0

Est-ce un int8? – astiefel

+1

@astiefel vous pouvez convertir à travers les types numériques; voir https://wiki.haskell.org/Converting_numbers –

+0

y a-t-il un moyen de l'inverser? Parce que j'ai la méthode de décompression suivante: 'unpack :: Word8 -> [Word8] décompresser 0 = [0] déballer x = inverser (aller x) où aller 0 = [] aller n | n 'mod' 2 == 1 = 1: aller (n' div' 2) | n 'mod' 2 == 0 = 0: go (n' div' 2) | sinon = [] 'mais je ne peux pas emballer puis décompresser – astiefel