Integer logic and bit fiddling#
Preliminaries#
Let us load the mp++ runtime, include the integer.hpp
header and import the user-defined literals:
#pragma cling add_include_path("$CONDA_PREFIX/include")
#pragma cling add_library_path("$CONDA_PREFIX/lib")
#pragma cling load("mp++")
#include <mp++/integer.hpp>
using namespace mppp::literals;
Let us also include a few useful bits from the standard library:
#include <iostream>
Logic and bit fiddling#
Multiprecision integers support the standard bitwise operators, such as the bitwise NOT operator:
~(0_z1)
-1
~(123_z1)
-124
Negative integers are treated as-if they were represented using two’s complement:
~(-1_z1)
0
~(-124_z1)
123
The bitwise OR, AND and XOR operators:
std::cout << (0b01001010_z1 | 0b10010100_z1).to_string(2);
11011110
std::cout << (0b11001010_z1 & 0b10010100_z1).to_string(2);
10000000
std::cout << (0b11001010_z1 ^ 0b10010100_z1).to_string(2);
1011110
Multiprecision integer arguments can be mixed with C++ integral arguments:
std::cout << (0b01001010_z1 | 45).to_string(2);
1101111
std::cout << (-123ll & 0b10010100_z1).to_string(2);
10000100
std::cout << (255u ^ 0b10010100_z1).to_string(2);
1101011
The in-place variants are supported as well:
{
auto n = 0b001_z1;
n |= 0b111_z1;
std::cout << n << '\n';
}
7
{
int n = -0b101010;
n &= 0b111_z1;
std::cout << n << '\n';
}
6
{
auto n = 0b001_z1;
n ^= 0b111_z1;
std::cout << n << '\n';
}
1