Power-of-Two Indexing: Bitwise AND vs operator%
Question 6 / 51 • Correct so far: 0 (0 answered)
Bitwise And
std::uint64_t sumBuckets(const std::vector<std::uint32_t>& data) {
const std::uint32_t mask = runtimeCapacity() - 1;
std::uint64_t sum = 0;
for (std::uint32_t x : data)
sum += x & mask;
return sum;
}
std::uint64_t result = sumBuckets(DATA); Modulo Op
std::uint64_t sumBuckets(const std::vector<std::uint32_t>& data) {
const std::uint32_t capacity = runtimeCapacity();
std::uint64_t sum = 0;
for (std::uint32_t x : data)
sum += x % capacity;
return sum;
}
std::uint64_t result = sumBuckets(DATA); Shared test data (shared-setup)
constexpr std::uint32_t kCapacity = 8192;
constexpr std::uint32_t kMask = kCapacity - 1;
constexpr int kDataSize = 65536;
static std::uint32_t runtimeCapacity() {
static volatile std::uint32_t capacity = kCapacity;
return capacity;
}
static std::vector<std::uint32_t> makeData() {
std::vector<std::uint32_t> v(kDataSize);
for (int i = 0; i < kDataSize; ++i)
v[i] = static_cast<std::uint32_t>(i * 2654435761u);
return v;
}
static const std::vector<std::uint32_t> DATA = makeData(); Which snippet is faster?
Snippet A is faster. Here the capacity is runtime data, so x % cap is a
real integer modulo operation. If capacity is known to be power-of-two,
x & (cap - 1) computes the same index with a single bitwise instruction.
Benchmark results
| Snippet | CPU time / iteration | Speedup |
|---|---|---|
| Bitwise And | 2.14 us | 34.1× |
| Modulo Op | 73.1 us | 1.0× |
Explore the source
Open in Compiler ExplorerQuiz complete. You can return to the question list to restart and compare.