### 6.7 Bool-vectors

A bool-vector is much like a vector, except that it stores only the values `t` and `nil`. If you try to store any non-`nil` value into an element of the bool-vector, the effect is to store `t` there. As with all arrays, bool-vector indices start from 0, and the length cannot be changed once the bool-vector is created. Bool-vectors are constants when evaluated.

Several functions work specifically with bool-vectors; aside from that, you manipulate them with same functions used for other kinds of arrays.

Function: make-bool-vector length initial

Return a new bool-vector of length elements, each one initialized to initial.

Function: bool-vector &rest objects

This function creates and returns a bool-vector whose elements are the arguments, objects.

Function: bool-vector-p object

This returns `t` if object is a bool-vector, and `nil` otherwise.

There are also some bool-vector set operation functions, described below:

Function: bool-vector-exclusive-or a b &optional c

Return bitwise exclusive or of bool vectors a and b. If optional argument c is given, the result of this operation is stored into c. All arguments should be bool vectors of the same length.

Function: bool-vector-union a b &optional c

Return bitwise or of bool vectors a and b. If optional argument c is given, the result of this operation is stored into c. All arguments should be bool vectors of the same length.

Function: bool-vector-intersection a b &optional c

Return bitwise and of bool vectors a and b. If optional argument c is given, the result of this operation is stored into c. All arguments should be bool vectors of the same length.

Function: bool-vector-set-difference a b &optional c

Return set difference of bool vectors a and b. If optional argument c is given, the result of this operation is stored into c. All arguments should be bool vectors of the same length.

Function: bool-vector-not a &optional b

Return set complement of bool vector a. If optional argument b is given, the result of this operation is stored into b. All arguments should be bool vectors of the same length.

Function: bool-vector-subsetp a b

Return `t` if every `t` value in a is also `t` in b, `nil` otherwise. All arguments should be bool vectors of the same length.

Function: bool-vector-count-consecutive a b i

Return the number of consecutive elements in a equal b starting at i. `a` is a bool vector, b is `t` or `nil`, and i is an index into `a`.

Function: bool-vector-count-population a

Return the number of elements that are `t` in bool vector a.

The printed form represents up to 8 boolean values as a single character:

```(bool-vector t nil t nil)
⇒ #&4"^E"
(bool-vector)
⇒ #&0""
```

You can use `vconcat` to print a bool-vector like other vectors:

```(vconcat (bool-vector nil t nil t))
⇒ [nil t nil t]
```

Here is another example of creating, examining, and updating a bool-vector:

```(setq bv (make-bool-vector 5 t))
⇒ #&5"^_"
(aref bv 1)
⇒ t
(aset bv 3 nil)
⇒ nil
bv
⇒ #&5"^W"
```

These results make sense because the binary codes for control-_ and control-W are 11111 and 10111, respectively.