/Data/BitUtil.hs

http://github.com/exclipy/pdata · Haskell · 291 lines · 281 code · 8 blank · 2 comment · 1 complexity · 1af91454ea4e17623ae26669db70734d MD5 · raw file

  1. module Data.BitUtil where
  2. import Data.Bits
  3. import Data.Word
  4. import Data.Int
  5. import Data.List (foldl')
  6. -- Bit operations
  7. -- Given a bitmap and a subhash, this function returns the index into the list
  8. fromBitmap :: (Integral b, Integral c) => Int32 -> b -> c
  9. fromBitmap bitmap subHash =
  10. let mask = fromIntegral (pred (toBitmap subHash :: Word32)) :: Int32
  11. in bitCount32 $ bitmap .&. mask
  12. toBitmap :: (Bits t, Num t, Integral a) => a -> t
  13. toBitmap subHash = 1 `shiftL` fromIntegral subHash
  14. bitmapToIndices :: (Bits a, Num a, Num b, Eq b) => a -> [b]
  15. bitmapToIndices bitmap = loop 0 bitmap
  16. where loop _ 0 = []
  17. loop 32 _ = []
  18. loop ix bitmap | bitmap .&. 1 == 0 = loop (ix+1) (bitmap `shiftR` 1)
  19. | otherwise = ix:(loop (ix+1) (bitmap `shiftR` 1))
  20. indicesToBitmap :: (Bits a, Num a) => [Int] -> a
  21. indicesToBitmap = foldl' (\bm ix -> bm .|. (1 `shiftL` ix)) 0
  22. bitCount32 :: (Integral a) => Int32 -> a
  23. bitCount32 x = bitCount8 ((x `shiftR` 24) .&. 0xff) +
  24. bitCount8 ((x `shiftR` 16) .&. 0xff) +
  25. bitCount8 ((x `shiftR` 8) .&. 0xff) +
  26. bitCount8 (x .&. 0xff)
  27. bitCount8 :: (Bits a, Num a, Integral b) => a -> b
  28. bitCount8 0 = 0
  29. bitCount8 1 = 1
  30. bitCount8 2 = 1
  31. bitCount8 3 = 2
  32. bitCount8 4 = 1
  33. bitCount8 5 = 2
  34. bitCount8 6 = 2
  35. bitCount8 7 = 3
  36. bitCount8 8 = 1
  37. bitCount8 9 = 2
  38. bitCount8 10 = 2
  39. bitCount8 11 = 3
  40. bitCount8 12 = 2
  41. bitCount8 13 = 3
  42. bitCount8 14 = 3
  43. bitCount8 15 = 4
  44. bitCount8 16 = 1
  45. bitCount8 17 = 2
  46. bitCount8 18 = 2
  47. bitCount8 19 = 3
  48. bitCount8 20 = 2
  49. bitCount8 21 = 3
  50. bitCount8 22 = 3
  51. bitCount8 23 = 4
  52. bitCount8 24 = 2
  53. bitCount8 25 = 3
  54. bitCount8 26 = 3
  55. bitCount8 27 = 4
  56. bitCount8 28 = 3
  57. bitCount8 29 = 4
  58. bitCount8 30 = 4
  59. bitCount8 31 = 5
  60. bitCount8 32 = 1
  61. bitCount8 33 = 2
  62. bitCount8 34 = 2
  63. bitCount8 35 = 3
  64. bitCount8 36 = 2
  65. bitCount8 37 = 3
  66. bitCount8 38 = 3
  67. bitCount8 39 = 4
  68. bitCount8 40 = 2
  69. bitCount8 41 = 3
  70. bitCount8 42 = 3
  71. bitCount8 43 = 4
  72. bitCount8 44 = 3
  73. bitCount8 45 = 4
  74. bitCount8 46 = 4
  75. bitCount8 47 = 5
  76. bitCount8 48 = 2
  77. bitCount8 49 = 3
  78. bitCount8 50 = 3
  79. bitCount8 51 = 4
  80. bitCount8 52 = 3
  81. bitCount8 53 = 4
  82. bitCount8 54 = 4
  83. bitCount8 55 = 5
  84. bitCount8 56 = 3
  85. bitCount8 57 = 4
  86. bitCount8 58 = 4
  87. bitCount8 59 = 5
  88. bitCount8 60 = 4
  89. bitCount8 61 = 5
  90. bitCount8 62 = 5
  91. bitCount8 63 = 6
  92. bitCount8 64 = 1
  93. bitCount8 65 = 2
  94. bitCount8 66 = 2
  95. bitCount8 67 = 3
  96. bitCount8 68 = 2
  97. bitCount8 69 = 3
  98. bitCount8 70 = 3
  99. bitCount8 71 = 4
  100. bitCount8 72 = 2
  101. bitCount8 73 = 3
  102. bitCount8 74 = 3
  103. bitCount8 75 = 4
  104. bitCount8 76 = 3
  105. bitCount8 77 = 4
  106. bitCount8 78 = 4
  107. bitCount8 79 = 5
  108. bitCount8 80 = 2
  109. bitCount8 81 = 3
  110. bitCount8 82 = 3
  111. bitCount8 83 = 4
  112. bitCount8 84 = 3
  113. bitCount8 85 = 4
  114. bitCount8 86 = 4
  115. bitCount8 87 = 5
  116. bitCount8 88 = 3
  117. bitCount8 89 = 4
  118. bitCount8 90 = 4
  119. bitCount8 91 = 5
  120. bitCount8 92 = 4
  121. bitCount8 93 = 5
  122. bitCount8 94 = 5
  123. bitCount8 95 = 6
  124. bitCount8 96 = 2
  125. bitCount8 97 = 3
  126. bitCount8 98 = 3
  127. bitCount8 99 = 4
  128. bitCount8 100 = 3
  129. bitCount8 101 = 4
  130. bitCount8 102 = 4
  131. bitCount8 103 = 5
  132. bitCount8 104 = 3
  133. bitCount8 105 = 4
  134. bitCount8 106 = 4
  135. bitCount8 107 = 5
  136. bitCount8 108 = 4
  137. bitCount8 109 = 5
  138. bitCount8 110 = 5
  139. bitCount8 111 = 6
  140. bitCount8 112 = 3
  141. bitCount8 113 = 4
  142. bitCount8 114 = 4
  143. bitCount8 115 = 5
  144. bitCount8 116 = 4
  145. bitCount8 117 = 5
  146. bitCount8 118 = 5
  147. bitCount8 119 = 6
  148. bitCount8 120 = 4
  149. bitCount8 121 = 5
  150. bitCount8 122 = 5
  151. bitCount8 123 = 6
  152. bitCount8 124 = 5
  153. bitCount8 125 = 6
  154. bitCount8 126 = 6
  155. bitCount8 127 = 7
  156. bitCount8 128 = 1
  157. bitCount8 129 = 2
  158. bitCount8 130 = 2
  159. bitCount8 131 = 3
  160. bitCount8 132 = 2
  161. bitCount8 133 = 3
  162. bitCount8 134 = 3
  163. bitCount8 135 = 4
  164. bitCount8 136 = 2
  165. bitCount8 137 = 3
  166. bitCount8 138 = 3
  167. bitCount8 139 = 4
  168. bitCount8 140 = 3
  169. bitCount8 141 = 4
  170. bitCount8 142 = 4
  171. bitCount8 143 = 5
  172. bitCount8 144 = 2
  173. bitCount8 145 = 3
  174. bitCount8 146 = 3
  175. bitCount8 147 = 4
  176. bitCount8 148 = 3
  177. bitCount8 149 = 4
  178. bitCount8 150 = 4
  179. bitCount8 151 = 5
  180. bitCount8 152 = 3
  181. bitCount8 153 = 4
  182. bitCount8 154 = 4
  183. bitCount8 155 = 5
  184. bitCount8 156 = 4
  185. bitCount8 157 = 5
  186. bitCount8 158 = 5
  187. bitCount8 159 = 6
  188. bitCount8 160 = 2
  189. bitCount8 161 = 3
  190. bitCount8 162 = 3
  191. bitCount8 163 = 4
  192. bitCount8 164 = 3
  193. bitCount8 165 = 4
  194. bitCount8 166 = 4
  195. bitCount8 167 = 5
  196. bitCount8 168 = 3
  197. bitCount8 169 = 4
  198. bitCount8 170 = 4
  199. bitCount8 171 = 5
  200. bitCount8 172 = 4
  201. bitCount8 173 = 5
  202. bitCount8 174 = 5
  203. bitCount8 175 = 6
  204. bitCount8 176 = 3
  205. bitCount8 177 = 4
  206. bitCount8 178 = 4
  207. bitCount8 179 = 5
  208. bitCount8 180 = 4
  209. bitCount8 181 = 5
  210. bitCount8 182 = 5
  211. bitCount8 183 = 6
  212. bitCount8 184 = 4
  213. bitCount8 185 = 5
  214. bitCount8 186 = 5
  215. bitCount8 187 = 6
  216. bitCount8 188 = 5
  217. bitCount8 189 = 6
  218. bitCount8 190 = 6
  219. bitCount8 191 = 7
  220. bitCount8 192 = 2
  221. bitCount8 193 = 3
  222. bitCount8 194 = 3
  223. bitCount8 195 = 4
  224. bitCount8 196 = 3
  225. bitCount8 197 = 4
  226. bitCount8 198 = 4
  227. bitCount8 199 = 5
  228. bitCount8 200 = 3
  229. bitCount8 201 = 4
  230. bitCount8 202 = 4
  231. bitCount8 203 = 5
  232. bitCount8 204 = 4
  233. bitCount8 205 = 5
  234. bitCount8 206 = 5
  235. bitCount8 207 = 6
  236. bitCount8 208 = 3
  237. bitCount8 209 = 4
  238. bitCount8 210 = 4
  239. bitCount8 211 = 5
  240. bitCount8 212 = 4
  241. bitCount8 213 = 5
  242. bitCount8 214 = 5
  243. bitCount8 215 = 6
  244. bitCount8 216 = 4
  245. bitCount8 217 = 5
  246. bitCount8 218 = 5
  247. bitCount8 219 = 6
  248. bitCount8 220 = 5
  249. bitCount8 221 = 6
  250. bitCount8 222 = 6
  251. bitCount8 223 = 7
  252. bitCount8 224 = 3
  253. bitCount8 225 = 4
  254. bitCount8 226 = 4
  255. bitCount8 227 = 5
  256. bitCount8 228 = 4
  257. bitCount8 229 = 5
  258. bitCount8 230 = 5
  259. bitCount8 231 = 6
  260. bitCount8 232 = 4
  261. bitCount8 233 = 5
  262. bitCount8 234 = 5
  263. bitCount8 235 = 6
  264. bitCount8 236 = 5
  265. bitCount8 237 = 6
  266. bitCount8 238 = 6
  267. bitCount8 239 = 7
  268. bitCount8 240 = 4
  269. bitCount8 241 = 5
  270. bitCount8 242 = 5
  271. bitCount8 243 = 6
  272. bitCount8 244 = 5
  273. bitCount8 245 = 6
  274. bitCount8 246 = 6
  275. bitCount8 247 = 7
  276. bitCount8 248 = 5
  277. bitCount8 249 = 6
  278. bitCount8 250 = 6
  279. bitCount8 251 = 7
  280. bitCount8 252 = 6
  281. bitCount8 253 = 7
  282. bitCount8 254 = 7
  283. bitCount8 255 = 8