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

\ Licensed under the Apache License, Version 2.0 (the "License");
\ you may not use this file except in compliance with the License.
\ You may obtain a copy of the License at

\     http://www.apache.org/licenses/LICENSE-2.0

\ Unless required by applicable law or agreed to in writing, software
\ distributed under the License is distributed on an "AS IS" BASIS,
\ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\ See the License for the specific language governing permissions and
\ limitations under the License.

: 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
Advertisement

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s