В этом примере мы покажем, как можно манипулировать отдельными битами внутри целого числа, мы начнем с часто необходимого вычисления2n- 1, которое мы, очевидно, могли бы реализовать следующим образом:
using boost::multiprecision::cpp_int;
cpp_int b1(unsigned n)
{
cpp_int r(1);
return (r << n) - 1;
}
Звонок:
std::cout << std::hex << std::showbase << b1(200) << std::endl;
Доходность, как и ожидалось:
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
Тем не менее, мы могли бы в равной степени просто установить бит в результате, как это:
cpp_int b2(unsigned n)
{
cpp_int r(0);
return --bit_set(r, n);
}
Обратите внимание, как функция<bit_set
>устанавливает указанный бит в своем аргументе, а затем возвращает ссылку на результат, который затем мы можем просто уменьшить. Призыв<b2
>— это то же самое, что призыв<b1
>.
Мы можем одинаково тестировать биты, поэтому, например, n-й бит результата, возвращаемого из<b2
>, не должен быть установлен, если мы не увеличиваем его сначала:
assert(!bit_test(b1(200), 200));
assert(bit_test(++b1(200), 200));
И, конечно, если мы перевернем n-й бит после увеличения, то мы должны вернуться к нулю:
assert(!bit_flip(++b1(200), 200));