2016-11-12 2 views
0

int가 있고, 6을 말하면 비트 배열로 변환하고 싶습니다.OCaml에서 int를 비트 배열로 변환

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

나를 위해이 작업을 수행하는 기능이 있습니까?

부울 배열을받는 다른 함수로 전달할 수 있도록 배열이 필요했습니다.

답변

3
정수 xn 번째 비트는 다음의 함수로 계산 될 수

:

let nth_bit x n = x land (1 lsl n) <> 0 
배열 만들고 Array.init 기능을 초기화 할 수

는 :

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

이 만드는 것 LSB (Least Significant Bit) 첫 번째 순서로 부울 배열. 당신은 정수 배열을 필요로하는 경우에, 당신은 nth_bit 대신 기능 nth_bit_value를 사용할 수 있습니다

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

나는 MSB-순서로 배열을 얻기 위해, 운동으로 떠날 것이다.

+0

어떻게 단 1 개 매개 변수 nth_bit 호출 할 수있다? –

+0

'nth_bit'은 카레 함수이므로 첫 번째 인수 ('x')에 적용하면 나머지 인수 (이 경우'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|]