Go to the Next or Previous section, the Detailed Contents, or the Amiga E Encyclopedia.

## 8.5 Sets

Yet another kind of constant definition is the set definition. This useful for defining flag sets, i.e., a number of options each of which can be on or off. The definition is like a simple enumeration, but using the `SET` keyword and this time the values start at one and increase as powers of two (so the next value is two, the next is four, the next eight, and so on). Therefore, the following definitions are equivalent:

```SET ENGLISH, FRENCH, GERMAN, JAPANESE, RUSSIAN

CONST ENGLISH=1, FRENCH=2, GERMAN=4, JAPANESE=8, RUSSIAN=16
```

However, the significance of the values it is best shown by using binary constants:

```CONST ENGLISH=%00001, FRENCH=%00010, GERMAN=%00100,
JAPANESE=%01000, RUSSIAN=%10000
```

If a person speaks just English then we can use the constant `ENGLISH`. If they also spoke Japanese then to represent this with a single value we'd normally need a new constant (something like `ENG_JAP`). In fact, we'd probably need a constant for each combination of languages a person might know. However, with the set definition we can `OR` the `ENGLISH` and `JAPANESE` values together to get a new value, `%01001`, and this represents a set containing both `ENGLISH` and `JAPANESE`. On the other hand, to find out if someone speaks French we would `AND` the value for the languages they know with `%00010` (or the constant `FRENCH`). (As you might have guessed, `AND` and `OR` are really bit-wise operators, not simply logical operators. See 10.4.3 Bitwise `AND` and `OR`.)

Consider this program fragment:

```  speak:=GERMAN OR ENGLISH OR RUSSIAN  /* Speak any of these */
IF speak AND JAPANESE
WriteF('Can speak in Japanese\n')
ELSE
WriteF('Unable to speak in Japanese\n')
ENDIF
IF speak AND (GERMAN OR FRENCH)
WriteF('Can speak in German or French\n')
ELSE
WriteF('Unable to speak in German or French\n')
ENDIF
```

The assignment sets `speak` to show that the person can speak in German, English or Russian. The first `IF` block tests whether the person can speak in Japanese, and the second tests whether they can speak in German or French.

When using sets be careful you don't get tempted to add values instead of `OR`-ing them. Adding two different constants from the same set is the same as `OR`-ing them, but adding the same set constant to itself isn't. This is not the only time addition doesn't give the same answer, but it's the most obvious. If you to stick to using `OR` you won't have a problem.

Go to the Next or Previous section, the Detailed Contents, or the Amiga E Encyclopedia.