C++14coreintermediate
Binary Literals
C++14 · Modern Refined · Compiler flag: -std=c++14
Explanation
Integer literals can be written in binary using the `0b` or `0B` prefix, making bit-level operations explicit and self-documenting. This is especially valuable in embedded, networking, and graphics code where individual bit patterns have specific meanings.
Real-World Scenario
An embedded firmware driver configures a sensor’s control register by setting specific bits for sampling rate, power mode, and interrupt enable, with binary literals making each bit’s purpose immediately visible.
Quick Snippet
snippet.cpp
#include <iostream>
#include <bitset>
constexpr uint8_t POWER_ON = 0b0000’0001;
constexpr uint8_t HIGH_PRECISION = 0b0000’0010;
constexpr uint8_t IRQ_ENABLE = 0b0001’0000;
int main() {
uint8_t config = POWER_ON | HIGH_PRECISION | IRQ_ENABLE; // 0b00010011
std::cout << "Register: " << std::bitset<8>(config) << "\n";
}Full Example
binary_literals.cpp
// CodeNebula - C++14 Example: Binary Literals
// Compile: g++ -std=c++14 -Wall -Wextra -o example binary_literals.cpp
// Demonstrates the 0b (or 0B) prefix for binary literals introduced in C++14.
// Real-world use: hardware register manipulation, bitmask definitions,
// network protocol flags, and any code where bit patterns matter.
#include <iostream>
#include <bitset>
#include <cstdint>
int main()
{
// ------------------------------------------------------------------
// 1. Basic binary literals
// ------------------------------------------------------------------
auto byte_val = 0b11001010; // 202 in decimal
auto nibble = 0b1111; // 15
auto single = 0b1; // 1
auto zero = 0b0; // 0
std::cout << "=== Basic Binary Literals ===" << std::endl;
std::cout << " 0b11001010 = " << byte_val << std::endl;
std::cout << " 0b1111 = " << nibble << std::endl;
std::cout << " 0b1 = " << single << std::endl;
std::cout << " 0b0 = " << zero << std::endl;
std::cout << std::endl;
// ------------------------------------------------------------------
// 2. Hardware register flags (e.g., SPI control register)
// ------------------------------------------------------------------
constexpr uint8_t SPI_ENABLE = 0b00000001; // bit 0
constexpr uint8_t SPI_MASTER = 0b00000100; // bit 2
constexpr uint8_t SPI_CPOL = 0b00001000; // bit 3
constexpr uint8_t SPI_CPHA = 0b00010000; // bit 4
constexpr uint8_t SPI_SPEED_DIV = 0b01100000; // bits 5-6
uint8_t spi_config = SPI_ENABLE | SPI_MASTER | SPI_CPOL;
std::cout << "=== Hardware Register Flags ===" << std::endl;
std::cout << " SPI_ENABLE : " << std::bitset<8>(SPI_ENABLE) << std::endl;
std::cout << " SPI_MASTER : " << std::bitset<8>(SPI_MASTER) << std::endl;
std::cout << " SPI_CPOL : " << std::bitset<8>(SPI_CPOL) << std::endl;
std::cout << " SPI_CPHA : " << std::bitset<8>(SPI_CPHA) << std::endl;
std::cout << " SPI_SPEED_DIV : " << std::bitset<8>(SPI_SPEED_DIV) << std::endl;
std::cout << " Combined cfg : " << std::bitset<8>(spi_config)
<< " (decimal " << static_cast<int>(spi_config) << ")" << std::endl;
std::cout << std::endl;
// ------------------------------------------------------------------
// 3. Bitmask operations with binary literals
// ------------------------------------------------------------------
uint8_t permissions = 0b00000000;
constexpr uint8_t READ = 0b00000100; // r bit
constexpr uint8_t WRITE = 0b00000010; // w bit
constexpr uint8_t EXECUTE = 0b00000001; // x bit
permissions |= READ | WRITE; // grant read + write
std::cout << "=== File Permission Bitmasks ===" << std::endl;
std::cout << " READ : " << std::bitset<3>(READ) << std::endl;
std::cout << " WRITE : " << std::bitset<3>(WRITE) << std::endl;
std::cout << " EXECUTE : " << std::bitset<3>(EXECUTE) << std::endl;
std::cout << " Current : " << std::bitset<3>(permissions)
<< " (rw-)" << std::endl;
permissions |= EXECUTE;
std::cout << " +exec : " << std::bitset<3>(permissions)
<< " (rwx)" << std::endl;
permissions &= ~WRITE;
std::cout << " -write : " << std::bitset<3>(permissions)
<< " (r-x)" << std::endl;
std::cout << std::endl;
// ------------------------------------------------------------------
// 4. Comparing with other bases
// ------------------------------------------------------------------
std::cout << "=== Same Value in Different Bases ===" << std::endl;
std::cout << " Binary : 0b11111111 = " << 0b11111111 << std::endl;
std::cout << " Octal : 0377 = " << 0377 << std::endl;
std::cout << " Decimal: 255 = " << 255 << std::endl;
std::cout << " Hex : 0xFF = " << 0xFF << std::endl;
return 0;
}
/*
Expected output:
=== Basic Binary Literals ===
0b11001010 = 202
0b1111 = 15
0b1 = 1
0b0 = 0
=== Hardware Register Flags ===
SPI_ENABLE : 00000001
SPI_MASTER : 00000100
SPI_CPOL : 00001000
SPI_CPHA : 00010000
SPI_SPEED_DIV : 01100000
Combined cfg : 00001101 (decimal 13)
=== File Permission Bitmasks ===
READ : 100
WRITE : 010
EXECUTE : 001
Current : 110 (rw-)
+exec : 111 (rwx)
-write : 101 (r-x)
=== Same Value in Different Bases ===
Binary : 0b11111111 = 255
Octal : 0377 = 255
Decimal: 255 = 255
Hex : 0xFF = 255
*/
Run command
g++ -std=c++14 -Wall -Wextra -o example binary_literals.cpp