2016-11-12 3 views
0

У меня есть int, давайте скажем 6, и я хочу преобразовать его в бит-массив.Преобразование массива int в бит в OCaml

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

Есть ли какая-либо функция, которая делает это для меня?

Мне нужен был массив, чтобы я мог передать его другой функции, которая получает булевский массив.

ответ

3

n -го бита целого числа x может быть вычислена с помощью следующей функции:

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

Массив может быть создан и инициализирован с функцией Array.init:

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

Это позволит создать массив булевых элементов в младшем бит (младший значащий бит) первого порядка. Если вам нужен массив целых чисел, то вы можете использовать функцию nth_bit_value вместо nth_bit:

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

я оставлю его в качестве упражнения, чтобы получить массив в MSB порядка.

+0

Как это я могу назвать nth_bit с 1 параметром только? –

+0

'nth_bit' - это валютная функция, поэтому применение ее к первому аргументу (' '' 'возвращает функцию, принимающую остальные аргументы (в данном случае -' n'). –

+0

Это называется частичным приложением. Когда у вас есть функция с аргументами 'n', вы можете передать ей аргументы' k', и результат будет функцией, которая принимает остальные аргументы 'n-k'. В нашем случае '(nth_bit x)' совпадает с '(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   
;; 

Тест

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

Или

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|] 
Смежные вопросы