bitfield ( bitspec -- quot )

Factor handbook » The language » Numbers » Arithmetic » Bitwise arithmetic » Additional bitwise arithmetic » Constructing bit fields

Factor handbook » The language » Numbers » Arithmetic » Bitwise arithmetic » Additional bitwise arithmetic » Constructing bit fields

Vocabulary

math.bitwise

Inputs

Outputs

None

Word description

Constructs an integer (bit field) from a series of values on the stack together with a bit field specifier, which is an array whose elements have one of the following shapes:

The last entry in the bit field specifier is processed in reverse, so stack values are supplied in reverse order, e.g. the leftmost stack value is the last bit field specifier.

Examples

Consider the following specification:

Such a bit field construction can be specified with a word like the following:

Square the 3 from the stack and shift 8, place the 1 from the stack at bit 5, and shift a constant 1 to bit 2:

See also

bitfield*

Definition

math.bitwise

Inputs

bitspec | an array |

Outputs

None

Word description

Constructs an integer (bit field) from a series of values on the stack together with a bit field specifier, which is an array whose elements have one of the following shapes:

• | { word shift } - word is applied to the top of the stack and the result is shifted to the left by shift bits and bitor'd with the bit field |

• | shift - the top of the stack is shifted to the left by shift bits and bitor'd with the bit field |

• | { constant shift } - constant is shifted to the left by shift bits and bitor'd with the bit field |

The last entry in the bit field specifier is processed in reverse, so stack values are supplied in reverse order, e.g. the leftmost stack value is the last bit field specifier.

Examples

Consider the following specification:

• | bits 0-10 are set to the value of x |

• | bits 11-14 are set to the value of y |

• | bit 15 is always on |

• | bits 16-20 are set to the value of fooify applied to z |

Such a bit field construction can be specified with a word like the following:

USING: math math.bitwise prettyprint ;
IN: math.bitwise.examples
: fooify ( x -- y ) 0b1111 bitand ;
: baz-bitfield ( x y z -- n )
{
{ fooify 16 }
{ 1 15 }
11
0
} bitfield ;
3 2 1 baz-bitfield .

102403

102403

Square the 3 from the stack and shift 8, place the 1 from the stack at bit 5, and shift a constant 1 to bit 2:

USING: math math.bitwise prettyprint ;
1 3
{
{ sq 8 }
5
{ 1 2 }
} bitfield .b

0b100100100100

0b100100100100

See also

bitfield*

Definition