Fast branchless max for unsigned integers
Data Structures & Algorithms practice on Codemia
Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.
Introduction
In the realm of high-performance computing, optimizing code for speed is crucial. One common operation in various algorithms is finding the maximum of two unsigned integers. Traditionally, this involves branching with conditional statements like if-else, which can introduce performance penalties due to branch prediction misses on modern processors. To address this, a method known as Fast Branchless Max is used to efficiently calculate the maximum of two unsigned integers without branches.
The Problem with Branching
Branching, using conditional statements like if, can lead to inefficiencies in modern CPU pipelines due to branch misprediction. These mispredictions can result in a stall of the pipeline, ultimately reducing performance. This is particularly problematic in hot code paths within loops or frequently called functions.
Branchless Max Operation
The branchless max technique allows you to compute the maximum of two numbers without any branching by utilizing bitwise operations and arithmetic, leveraging the properties of how numbers are represented in binary.
Implementation
Consider two unsigned integers a and b. The branchless implementation for finding the maximum can be implemented using the following expression:
Explanation
Let's break down the expression:
- XOR Operation
(a ^ b): This computes the bitwise difference betweenaandb. - Comparison
-(a < b): Evaluates whetherais less thanb. Whena < bis true, this yields1, which when negated (assuming a two's complement system), results in all bits being set (i.e.,0xFFFFFFFF). Otherwise, it results in0. - Bitwise AND & XOR Combination:
((a ^ b) & -(a < b)): Ifa < bis true, then the XOR differencea ^ bis kept. Otherwise, it becomes0.- This value is XORed with
a, effectively toggling the differing bits ifawas less thanb, resulting in retaining the value ofb.
Example
Let's take an example with values:
a = 5(binary0101)b = 9(binary1001)
Step-by-step Calculation:
- Calculate XOR:
(a ^ b) = (0101 ^ 1001) = 1100 - Comparison
(a < b):1(since5is less than9) - Negation gives:
-1(binary1111 1111 1111 1111in two's complement) - Bitwise AND:
(1100 & 1111 1111 1111 1111) = 1100 - XOR with
a:0101 ^ 1100 = 1001, which is9, the correct maximum.
Benefits and Use Cases
Performance Gains
The benefits of using a branchless max are most pronounced in scenarios where this operation is repeatedly executed, such as in:
- Graphics processing
- Gaming algorithms
- Financial computations
- Signal processing
The absence of branches not only improves prediction accuracy for other concurrent branches in loops but also optimizes instruction cache utilization.
Limitations
While branchless max is efficient, it does depend on the processor architecture's ability to effectively execute bitwise operations and arithmetic. The performance gain may vary based on the specific CPU and the surrounding code context.
Summary Table
| Method | Branching | Computation | Use Cases |
| Traditional | Yes | if-else to compare two numbers. | General usage |
| Branchless max | No | a ^ ((a ^ b) & -(a < b)) | High-performance, compute-intensive tasks |
Conclusion
The fast branchless max technique demonstrates how thoughtful utilization of bitwise operations can eliminate the need for conditional branches, delivering performance enhancements particularly critical in high-performance computing tasks. By reducing the dependency on branch prediction, it provides a more predictable and often faster pathway for calculating the maximum of two unsigned integer values. Understanding and applying such optimizations can be beneficial, particularly in performance-critical software development.
Related reading
- Fast calculation of floating 1/N if factorization of very large integer N is known
- Fast calculation of min, max, and average of incoming numbers
- Fast CRC algorithm?
- Fast Data structure for finding strict subsets from a given list
- Fast ceiling of an integer division in C / C
- Fast division algorithm for binary numbers
- fast efficient least squares fit algorithm in C?
- Fast element lookup for a functional languageHaskell

DSA Fundamentals
Master algorithmic patterns and data structures through hands-on LeetCode-style problems - from arrays and hashing to dynamic programming and advanced graphs.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
Data Structures & Algorithms practice on Codemia
Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.