# Bit Twiddling in Forth

Bit twiddling is fundamentally the same as in other programming languages. However, Forth allows us to change base for easy interactive bit twiddling:

``: binary 0x2 base ! ;``

To set a bit (to 1) we use bit-wise or. E.g.

``binary 10100011 00001000 or . <cr> 10101011  ok``

To clear a bit, we need bit-wise and.

``binary 10100011 11011111 and . <cr> 10000011  ok``

Toggling a bit uses bit-wise xor. Here we toggle two bits:

``binary 10100011 00110000 xor . <cr> 10010011  ok``

We can pull the value of a bit with and. In Forth, zero values are false, while non-zero values are true.

``binary 10100011 00100000 and [if] ." bit is set!" [else] ." bit is clear!" [then] <cr> bit is set! ok``

We can pull, say, the second byte out of a 16 bit word with a mask and the appropriate bit-wise rshift.

``binary 1001010111001011 hex ff00 and 8 rshift binary . <cr> 10010101  ok``

The following words are made available for convenience:

``````\ Copyright 2020 Christopher Howard

\ you may not use this file except in compliance with the License.
\ You may obtain a copy of the License at

\ Unless required by applicable law or agreed to in writing, software
\ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\ See the License for the specific language governing permissions and

: binary 0x2 base ! ;

: bit ( w n -- f ) 1 swap lshift and ;

: set ( w n -- w ) 1 swap lshift or ;

: clear ( w n -- w ) 1 swap lshift invert and ;

: toggle ( w n -- w ) 1 swap lshift xor ;

: byte0 ( w -- c ) 0xff and ;

: byte1 ( w -- c ) 0xff00 and 0x8 rshift ;``````

Example use:

``````binary 10010101 dup dup decimal 2 bit . 3 bit . 4 bit . <cr> 4 0 16 ok
binary 10010101 decimal 2 set 3 set binary . <cr> 10011101  ok
binary 10010101 decimal 2 clear 3 clear binary . <cr> 10010001  ok
binary 10010101 decimal 2 toggle 3 toggle binary . <cr> 10011001  ok
binary 1001010111001011 byte0 . <cr> 11001011  ok
binary 1001010111001011 byte1 . <cr> 10010101  ok``````