| // Copyright Microsoft and CHERIoT Contributors. | |
| // SPDX-License-Identifier: MIT | |
| /** | |
| * @file Bit manipulation utilities | |
| */ | |
| #pragma once | |
| #include <concepts> | |
| namespace ds::bits | |
| { | |
| /** | |
| * Isolate the least significant set bit. That is, clear all bits to the | |
| * left of the first set bit. | |
| */ | |
| template<typename T> | |
| __always_inline T isolate_least(T v) | |
| { | |
| return v & -v; | |
| } | |
| /** | |
| * Mask of all bits above and including the least significant set bit. | |
| */ | |
| template<typename T> | |
| __always_inline T above_or_least(T v) | |
| { | |
| return v | -v; | |
| } | |
| /** | |
| * Mask of all bits above the least significant set bit. | |
| */ | |
| template<typename T> | |
| __always_inline T above_least(T v) | |
| { | |
| return above_or_least(v << 1); | |
| } | |
| } // namespace ds::bits |