Bitset! datatype

1. Úvod

Hodnota typu bitset! je kolekce bitů, používaná k uložení booleovských hodnot 0 (false) a 1 (true). Bitset! je členem typesetu default!.

2. Vytvoření

Hodnota typu bitset! se vyhodnocuje při běhu programu (runtime) pomocí konstruktorů make nebo to, případně funkcí charset.

<bitset> ::= <make bitset! | charset | to-bistet> <spec>
<spec>   ::= < char! | string! | block! | integer* >
integer* ::= nelze použít u `to-bitset`

Výsledným formátem po kompilaci (ale před runtime) je:

== make bitset! #{hex-number}

Funkce make bitset! a to-bitset mohou mít také jako argument hodnotu typu binary!

>> tb: to-binary "Z"
== #{5A}
>> to-bitset tb
== make bitset! #{5A}

Obě funkce lze také použít k převodu skutečně binárního čísla na hexadecimální:

>> to-bitset 2#{10000101}   ; binární formát
== make bitset #{85}        ; hexadecimální formát

2.1. Make, To

Argument typu integer! pro konstruktor make vytváří prázdný bitset s vymezeným počtem míst.

>> make bitset! 10      ; create a bitset with bit 10 set
== make bitset! #{0000}
>> make bitset! #"A"    ; create a bitset with bit 65 set
>>   to bitset! #"A"
== make bitset! #{000000000000000040}
>> make bitset! "hi"   ; create a bitset with bits 104 and 105 set
>>   to bitset! "hi"
== make bitset! #{00000000000000000000000000C0}
>> make bitset! [120 "hello" #"A"]   ; create and set bits using different value representations
>>   to bitset! [120 "hello" #"A"]
== make bitset! #{00000000000000004000000004890080}

Použití rozsahů:

Rozsahy se vytvářejí dvěmi hodnotami typu char! nebo integer!, oddělenými pomlčkou s mezerami.

>> make bitset! [#"0" - #"9" #"a" - #"z"]   ; vytvoří bitset pro rozsah hodnot
>>   to bitset! [#"0" - #"9" #"a" - #"z"]
== make bitset! #{000000000000FFC0000000007FFFFFE0}

Bitsety jsou tak dlouhé, jak je zapotřebí - automaticky expandují dle potřeby. Velikost se zaokrouhluje k horní bajtové hranici (byte bound).

2.2. Charset

>> source charset
charset: func ["Shortcut for `make bitset!`"
    spec [block! integer! char! string!]
][
    make bitset! spec
]

Charset je náhrada příkazu make bitset!. Na rozdíl od konstruktorů make a to zde není přípustný argument typu `binary!.

>> charset #{2A}
*** Script Error: charset does not allow binary! for its spec argument
>> charset [120 "hello" #"A"]   ; vytvoří a nastaví bity pro různé typy hodnot
== make bitset! #{00000000000000004000000004890080}
>> charset [#"0" - #"9" #"a" - #"z"]   ; vytvoří bitset z rozsahu hodnot
== make bitset! #{000000000000FFC0000000007FFFFFE0}

3. Doplňky

Aby bylo možné se vypořádat s obsáhlým rozsahem znaků Unicode, jsou bity mimo bitsety považovány za virtuální bity, takže je možné je ověřovat a zadávat bez vyvolání chybového hlášení. Velikost bitsetu se automaticky zvěší podle aktuální potřeby.

To stále nestačí pro ošetření skutečně velkých rozsahů jako například u bitsetu pro všechny znaky Unicode kromě číslic. Pro takové případy je možné definovat komplementární (doplňkový) bitset, který reprezentuje doplňkový rozsah zadaných bitů. To umožňuje vytvoření velkých bitsetů s malým nárokem na obsazení paměti.

Komplementární bitsety lze vytvořit vložením slova not do specifikačního bloku.

charset [not "0123456789"]   ; all characters except digits
== make bitset! [not #{000000000000FFC0}]

K vytvoření komplementárních bitsetů lze rovněž použít příkaz complement:

>> b: make bitset! 42
== make bitset! #{000000000000}

>> complemented-b: complement b
== make bitset! [not #{000000000000}]
>> b: complement make bitset! 42
== make bitset! [not #{000000000000}]

Dotazem complement? zjistíme, zda byl posuzovaný bitset komplementován:

>> complement? complemented-b
== true

>> complement? b: complement make bitset! 42
== true

4. Zápis cesty

Pro čtení a psaní jednotlivých bitů (majících hodnotu true nebo false) použijeme notaci cesty:

bs: charset [#"a" - #"z"]
bs/97     ; will return true
bs/40     ; will return false
bs/97: false
bs/97     ; will return false

5. Množinové operace

Nativními funkcemi difference, exclude, intersect a union lze s bitsety provádět množinové operace:

>> a: charset "abc"
== make bitset! #{00000000000000000000000070}

>> b: charset "ABC"
== make bitset! #{000000000000000070}
>> difference a b
== make bitset! #{00000000000000007000000070}
>> exclude a b
== make bitset! #{00000000000000000000000070}
>> intersect a b
== make bitset! #{00000000000000000000000000}

Příkazem union se vytvoří nový bitset sloučením dvou bitsetů zadaných:

digit: charset "0123456789"
lower: charset [#"a" - #"z"]
upper: charset [#"A" - #"Z"]

letters:  union lower upper
hexa:     union upper digit
alphanum: union letters digit

6. Komparace

Na bitset! lze aplikovat všechny operátory: =, ==, <>, >, <, >=, <=, =?.

7. Testování hodnot

Dotazem bitset? ověříme, zda je posuzovaná hodnota typu bitset!.

>> b: make bitset! 42      ; prázdný bitset se zadanou velikostí
== make bitset! #{000000000000}  ; počet nul = (L / 8) * 2
>> L: length? b
== 48                      ; nejbližší násobek osmi

>> bitset? b
== true

Dotaz type? vrací datový typ posuzované hodnoty.

>> type? b
== bitset!

8. Předdefinovaná slova

8.1. Akce

and~, append, clear, complement, copy, find, insert, length?, negate, or~, pick, poke, remove, xor~

8.2. Funkce

bitset?, charset, to-bitset

8.3. Nativa

complement?, difference, exclude, intersect, union

8.4. Operátory

and, or, xor

results matching ""

    No results matching ""