Slides for P3793R0 — Better shifting

Document number:
P3898R0
Date:
2025-11-02
Audience:
SG6
Project:
ISO/IEC 14882 Programming Languages — C++, ISO/IEC JTC1/SC22/WG21
Reply-to:
Jan Schultke <janschultke@gmail.com>
Source:
github.com/Eisenwave/cpp-proposals/blob/master/src/better-shifting-slides.cow

This document has custom controls:

  • ,  ↓ : go to the next slide
  • ,  ↑ : go to previous slide

Better shifting
P3793R0

Brian Bi, Jan Schultke  |  Slides for P3793R0 — Better shifting  |  Kona 2025  |  Slide 1

Introduction

Brian Bi, Jan Schultke  |  Slides for P3793R0 — Better shifting  |  Kona 2025  |  Slide 2

Motivation

"Mathematically correct" functions eliminate special cases and UB pitfalls:

Before After
uint32_t make_mask(int n_bits) { if (n_bits >= 32) return uint32_t(-1); return (uint32_t(1) << n_bits) - 1; } uint32_t make_mask(int n_bits) { return shl(uint32_t(1), n_bits) - 1; }
uint32_t bitset = /* ... */; bool bitset_contains(size_t i) { if (i >= 32) return false; return (bitset >> i) & 1; } uint32_t bitset = /* ... */; bool bitset_contains(size_t i) { return shr(bitset, i) & 1; }
Brian Bi, Jan Schultke  |  Slides for P3793R0 — Better shifting  |  Kona 2025  |  Slide 3

Design choices

Brian Bi, Jan Schultke  |  Slides for P3793R0 — Better shifting  |  Kona 2025  |  Slide 4

Possible implementation

template<signed-or-unsigned T> T shl(T x, int s) noexcept { return unsigned(s) >= width-v<T> ? T(0) : x << unsigned(s); } template<signed-or-unsigned T> T shr(T x, int s) noexcept { return unsigned(s) >= width-v<T> ? T(x < 0 ? -1 : 0) : x >> unsigned(s); }
Brian Bi, Jan Schultke  |  Slides for P3793R0 — Better shifting  |  Kona 2025  |  Slide 5

References

[GitHub] Jan Schultke. integer-division GitHub repository https://github.com/Eisenwave/integer-division
[StackOverflowCeil] Fast ceiling of an integer division in C / C++ https://stackoverflow.com/q/2745074/5740428