1 people like it.
Like the snippet!
Convert booleans to bits and back
Convert an array of booleans to an array of bytes with 8 booleans packed in one byte. The reverse operation from a byte array to a boolean array is also provided.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
|
module BitConverter =
let pow2 y = 1 <<< y
// convert booleans to bytes in a space efficient way
let FromBooleans (bools:bool []) =
seq {
let b = ref 0uy
for i=0 to bools.Length-1 do
let rem = (i % 8)
if rem = 0 && i<> 0 then
yield !b
b := 0uy
if bools.[i] then
b := !b + (byte (pow2 rem))
yield !b
} |> Array.ofSeq
// to booleans only works for bytes created with FromBooleans
let ToBooleans (bytes:byte []) =
bytes
|> Array.map (fun b -> Array.init 8 (fun i -> ((pow2 i) &&& int b) > 0))
|> Array.concat
|
val pow2 : y:int32 -> int
Full name: Script.BitConverter.pow2
val y : int32
val FromBooleans : bools:bool [] -> byte []
Full name: Script.BitConverter.FromBooleans
val bools : bool []
type bool = System.Boolean
Full name: Microsoft.FSharp.Core.bool
Multiple items
val seq : sequence:seq<'T> -> seq<'T>
Full name: Microsoft.FSharp.Core.Operators.seq
--------------------
type seq<'T> = System.Collections.Generic.IEnumerable<'T>
Full name: Microsoft.FSharp.Collections.seq<_>
val b : byte ref
Multiple items
val ref : value:'T -> 'T ref
Full name: Microsoft.FSharp.Core.Operators.ref
--------------------
type 'T ref = Ref<'T>
Full name: Microsoft.FSharp.Core.ref<_>
val i : int
property System.Array.Length: int
val rem : int
Multiple items
val byte : value:'T -> byte (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.byte
--------------------
type byte = System.Byte
Full name: Microsoft.FSharp.Core.byte
module Array
from Microsoft.FSharp.Collections
val ofSeq : source:seq<'T> -> 'T []
Full name: Microsoft.FSharp.Collections.Array.ofSeq
val ToBooleans : bytes:byte [] -> bool []
Full name: Script.BitConverter.ToBooleans
val bytes : byte []
val map : mapping:('T -> 'U) -> array:'T [] -> 'U []
Full name: Microsoft.FSharp.Collections.Array.map
val b : byte
val init : count:int -> initializer:(int -> 'T) -> 'T []
Full name: Microsoft.FSharp.Collections.Array.init
Multiple items
val int : value:'T -> int (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.int
--------------------
type int = int32
Full name: Microsoft.FSharp.Core.int
--------------------
type int<'Measure> = int
Full name: Microsoft.FSharp.Core.int<_>
val concat : arrays:seq<'T []> -> 'T []
Full name: Microsoft.FSharp.Collections.Array.concat
More information