Я хочу скопировать младшие (наименее значимые) биты B из целого числа со знаком в целое число без знака, оба имеют произвольную разрядность. Гарантируется следующее:
Значение целого числа со знаком находится в пределах «диапазона B», т. е. оно находится между -2B-1 и 2B-1-1 (включительно).
B меньше или равно разрядности обоих целочисленных типов.
В реализации/архитектуре используется прямой порядок байтов.
Я хочу скопировать младшие (наименее значимые) биты B из целого числа со знаком в целое число без знака, оба имеют произвольную разрядность. Гарантируется следующее: [list] [*]Значение целого числа со знаком находится в пределах «диапазона B», т. е. оно находится между -2B-1 и 2B-1-1 (включительно). [*]B меньше или равно разрядности обоих целочисленных типов. [*]В реализации/архитектуре используется прямой порядок байтов. [/list] Я придумал следующее решение на основе memcpy: [code]template constexpr U mask() { if constexpr (B == 8 * sizeof(U)) return std::numeric_limits::max(); else return (static_cast(1)