BITS(3) BSD Library Functions Manual BITS(3)
__BIT, __BITS, __SHIFTIN, __SHIFTOUT, __SHIFTOUT_MASK -- macros for preparing bitmasks and
operating on bit fields
These macros prepare bitmasks, extract bitfields from words, and insert bitfields into
words. A ``bitfield'' is a span of consecutive bits defined by a bitmask, where 1s select
the bits in the bitfield.
Use __BIT() and __BITS() to define bitmasks:
Return a bitmask with bit n set, where the least significant bit is bit 0.
Return a bitmask with bits m through n, inclusive, set. It does not matter
whether m > n or m <= n. The least significant bit is bit 0.
__SHIFTIN(), __SHIFTOUT(), and __SHIFTOUT_MASK() help read and write bitfields from words:
Left-shift bits v into the bitfield defined by mask, and return them.
Extract and return the bitfield selected by mask from v, right-shift-
ing the bits so that the rightmost selected bit is at bit 0. No
Right-shift the bits in mask so that the rightmost non-zero bit is at
bit 0. This is useful for finding the greatest unsigned value that a
bitfield can hold. No side-effects. Note that __SHIFTOUT_MASK(m) =
The following example demonstrates basic usage of the bits macros:
uint32_t bits, mask, val;
bits = __BITS(2, 3); /* 00001100 */
mask = __BIT(2) | __BIT(3); /* 00001100 */
val = __SHIFTIN(0x03, mask); /* 00001100 */
val = __SHIFTOUT(0xf, mask); /* 00000011 */
The bits macros first appeared in atw(4), with different names and implementation. In their
current form these macros appeared in NetBSD 4.0.
The bits macros were written by David Young <dyoung@NetBSD.org>.
Matt Thomas <matt@NetBSD.org> suggested important improvements to the implementation, and
contributed the macro names SHIFTIN() and SHIFTOUT().
__BIT() and __BITS() can only express 32-bit bitmasks.
BSD October 17, 2012 BSD