X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Fbitvector.ml;h=6a0152a179e8f40a787c778360e48e7ca47985f7;hb=c5480c3711c7431e70f78871c738f2d86ecb96ac;hp=a44a58e91a77024daa624d39ffaa756287c02e84;hpb=acd23a33d837d03c813212ec3896a86edef16e87;p=tatoo.git diff --git a/src/bitvector.ml b/src/bitvector.ml index a44a58e..6a0152a 100644 --- a/src/bitvector.ml +++ b/src/bitvector.ml @@ -7,6 +7,11 @@ let create ?(init=false) size = bits = String.make (1 + size / 8) i } +let alloc size = + { length = size; + bits = String.create (1 + size / 8); + } + let length v = v.length let unsafe_get v n = @@ -14,7 +19,33 @@ let unsafe_get v n = and j = n mod 8 in (((Char.code (String.unsafe_get v.bits i)) lsr j) land 1) == 1 +let union v1 v2 = + assert ( v1.length == v2.length ); + let res = alloc v1.length in + (* Format.printf "size %d@." (String.length res.bits);*) + for i = 0 to String.length v1.bits - 1 do + res.bits.[i] <- Char.chr ((Char.code v1.bits.[i]) lor (Char.code v2.bits.[i])) + done; + res + +let inter v1 v2 = + assert ( v1.length == v2.length ); + let res = alloc v1.length in + for i = 0 to String.length v1.bits - 1 do + res.bits.[i] <- Char.chr ((Char.code v1.bits.[i]) land (Char.code v2.bits.[i])) + done; + res + +let diff v1 v2 = + assert ( v1.length == v2.length ); + let res = alloc v1.length in + for i = 0 to String.length v1.bits - 1 do + res.bits.[i] <- Char.chr ((Char.code v1.bits.[i]) land (lnot (Char.code v2.bits.[i]))) + done; + res + + let unsafe_set v n (b:bool) = let x : int = Obj.magic b in let i = n / 8