2016-11-12 5 views
0

J'ai un int, disons 6 et je veux le convertir en tableau de bits.Conversion d'un tableau int en bit dans OCaml

bArr.(0) = 1 
bArr.(1) = 1 
bArr.(2) = 0 

Y at-il une fonction qui fait cela pour moi?

J'avais besoin que ce soit un tableau pour pouvoir ensuite le passer à une autre fonction qui reçoit un tableau booléen.

Répondre

3

Le n-ième bit d'un nombre entier x peut être calculée avec la fonction suivante:

let nth_bit x n = x land (1 lsl n) <> 0 

Un réseau peut être créé et initialisé avec Array.init fonction:

let bitarray length x = Array.init length (nth_bit x) 

Cela créera un tableau de booléens dans un premier ordre LSB (Least Significant Bit). Si vous avez besoin d'un tableau d'entiers, vous pouvez utiliser une fonction nth_bit_value au lieu de nth_bit:

let nth_bit_value x n = if nth_bit x n then 1 else 0 

Je laisse comme un exercice, pour obtenir un tableau dans le MSB ordre.

+0

Comment est-ce que je peux appeler nth_bit avec 1 seul paramètre? –

+0

'nth_bit' est une fonction carrée, donc l'appliquer au premier argument (le' x') renvoie une fonction qui accepte les arguments restants (dans ce cas, le 'n'). –

+0

C'est ce qu'on appelle une application partielle. Quand vous avez une fonction avec des arguments 'n', vous pouvez lui passer des arguments' k', et le résultat serait une fonction qui accepte les autres arguments 'n-k'. Dans notre cas, '(nth_bit x)' est identique à '(fun i -> nth_bit x i)' – ivg

0
let int_to_bArr i = 
    let rec int_to_bit acc i = 
    if i=0 then acc 
    else int_to_bit (i land 1::acc) (i lsr 1) 
    in 
    let l=int_to_bit [] i in 
    Array.of_list l   
;; 

test

# int_to_bArr 6;; 
- : int array = [|1; 1; 0|] 

Ou

let int_to_bArr i = 
    let rec int_to_bool acc i = 
    if i=0 then acc 
    else int_to_bool (((i land 1)=1)::acc) (i lsr 1) 
    in 
    let l=int_to_bool [] i in 
    Array.of_list l 
;; 

# int_to_bArr 6;; 
- : bool array = [|true; true; false|]