`` Array of Bits
`` Using integers for storage

`` www.scriptol.net
`` Requires a Scriptol Compiler
`` 2005



class ArrayOfBits

    int[] bits        `the array of integers
    int size            `the number of bits
    constant int CBIT = 32
    
    `Create the array of bits as a string
    
    void ArrayOfBits(int s)
        int i = (s + CBIT - 1) / CBIT
        for int j in 0 -- i let bits.push(0)
        size = s
    return    

    ` Return a bit at pos

    boolean get(int pos)
        int i = pos / CBIT
        int bit = bits[i]
        int mask = 1 << (pos mod CBIT)
        bit = bit & mask
    return bit <> 0    

    `Change a bit to 0 or 1 at pos according to value

    void set(int pos, boolean value)
        int i = pos / CBIT
        int b = bits[i]
        int mask = 1 << (pos mod CBIT)
        if value = true
            b  = b | mask
        else    
            b  = b & ~mask
        /if
        bits[i] = b
    return

    `Invert the value of a bit, true become false and conversely

    void flip(int pos)
        int i = pos / CBIT
        int b = bits[i]
        int mask =  1 << (pos mod CBIT)      
        b =  b ^ mask         
        bits[i] = b
    return
    
    `Return the string of bits as an array of integers
    
    array toArray()
        array x
        for int i in 0 -- size
            boolean j = get(i)
            if j = true
                x.push(1)
            else
                x.push(0)
            /if    
        /for    
    return x                

/class



// demo

ArrayOfBits aob = ArrayOfBits(14)
aob.set(5, true)

aob.flip(8)



array y = aob.toArray()
print "Only 5 and 8 must be true:"
y.display()