If you are looking at the 8-bit binary sequence 11010110, the direct decimal conversion is 214 (assuming an unsigned integer). If interpreted as a signed 8-bit two's complement integer, the exact same binary sequence equals -42. Just as calculating AC amperage requires knowing your voltage, power factor, and phase (e.g., 120V single-phase vs. 230V 3-phase), converting binary to decimal requires knowing your bit-width, sign format, and endianness. A raw binary string is as meaningless as a power reading without a voltage baseline.

The foundational formula for base-2 to base-10 conversion is:

Decimal = (b_n × 2^n) + ... + (b_1 × 2^1) + (b_0 × 2^0)

Substituting our 8-bit value (11010110):
(1×128) + (1×64) + (0×32) + (1×16) + (0×8) + (1×4) + (1×2) + (0×1) = 214

The Core Assumptions: Bit-Width and Sign Format

In embedded systems, you rarely deal with isolated 8-bit numbers. When reading an I2C sensor like the MPU6050 accelerometer or pulling raw data from an ESP32 ADC peripheral, you are reading 16-bit or 12-bit registers. The assumption that fixes your answer is whether the microcontroller's ALU treats the Most Significant Bit (MSB) as a sign flag or a standard value.

Rule of Thumb: If your binary string starts with a 1 and the system expects signed data, your decimal result will be negative. If the system expects unsigned data, it will be a large positive number.
16-Bit Register Boundary Values (Common in I2C/SPI Sensors)
Binary (16-Bit) Unsigned Decimal Signed (Two's Comp) Hex Typical Embedded Context
0000000001111111 127 127 0x007F Max positive 8-bit signed value extended to 16-bit
0111111111111111 32,767 32,767 0x7FFF Max positive 16-bit signed integer (e.g., max gyro reading)
1000000000000000 32,768 -32,768 0x8000 Min negative 16-bit signed integer (MSB flipped)
1111111111111111 65,535 -1 0xFFFF I2C bus pull-up high / Read error state

How the Answer Shifts: 8-Bit vs 16-Bit vs 32-Bit Contexts

To understand how the answer shifts across different architectures, think of it like scaling voltage systems. An 8-bit register is your 120V branch circuit—limited in capacity (0 to 255). A 16-bit register is your 230V appliance circuit (0 to 65,535), and a 32-bit register is your 3-phase industrial feeder (0 to 4,294,967,295).

If you read the binary sequence 11111111 from an 8-bit port, it is 255. But if that same sequence is the lower byte of a 16-bit Little-Endian register (where the least significant byte is stored first), and the upper byte is 00000001, the combined binary is 0000000111111111, shifting your decimal answer to 511. Always verify the endianness in the sensor's datasheet before combining bytes.

Neighboring Values and Bit-Shifting (±20% Range)

When debugging PWM duty cycles or DAC outputs, you often need to estimate neighboring values without running a full calculation. Here is a reference table for values within a ±20% range of our target 214 (spanning roughly 171 to 255).

8-Bit Unsigned Neighboring Values around 214
Decimal Binary Hex Difference from 214
171 10101011 0xAB -43 (~20% lower)
192 11000000 0xC0 -22
214 11010110 0xD6 Baseline
235 11101011 0xEB +21
255 11111111 0xFF +41 (~20% higher)

When Binary-to-Decimal Conversion is Meaningless

Just as calculating real power (kW) is meaningless if your power factor is unknown, converting raw binary to a standard decimal integer is meaningless if the underlying encoding scheme is not pure base-2 math. You will brick your logic or misinterpret sensor data if you apply the standard formula to these three formats:

  1. IEEE 754 Floating Point: If a 32-bit register holds a temperature reading from a high-precision RTD module, it is likely encoded in IEEE 754 single-precision float format. The binary 01000000100100100000000000000000 does not equal 1,099,235,328. It equals 4.5625. The bits are split into a sign bit, an 8-bit exponent, and a 23-bit mantissa.
  2. Binary-Coded Decimal (BCD): Real-time clocks (RTCs) like the DS3231 store time in BCD. The binary 01011001 converts to 89 in pure decimal, but in BCD, the nibbles are read separately: 0101 (5) and 1001 (9), meaning the actual decimal value is 59 (e.g., 59 seconds).
  3. ASCII Characters: If you are reading a serial UART buffer, the binary 01000001 is mathematically 65, but contextually it is the character 'A'. Treating it as an integer for math operations will yield garbage logic.
Bench Tip: When writing C/C++ firmware for an ESP32 or Arduino, use union structures or built-in functions like memcpy to cast 32-bit IEEE 754 binary arrays directly into float variables. Do not attempt to manually shift and add bits for floating-point conversions.

FAQ: Embedded Systems Binary Conversions

How do I convert a negative decimal to binary in C++?

Microcontrollers handle negative numbers using two's complement. To manually convert -42 to 8-bit binary: start with positive 42 (00101010), invert all bits to get the one's complement (11010101), and add 1. The result is 11010110. In C++, simply casting an int8_t to a uint8_t will reveal the underlying two's complement binary structure.

Why does my 12-bit ESP32 ADC read 4095 in the dark?

A 12-bit ADC has a maximum decimal value of 4095 (111111111111 in binary). If your photodiode or LDR circuit is pulling the GPIO pin to 3.3V when dark, the ADC registers maximum voltage. This isn't a binary conversion error; it's a hardware biasing issue. You need a pull-down resistor or an inverted voltage divider to map darkness to 0V (binary 000000000000).

What is the fastest way to convert binary to decimal in my head?

Memorize the 'heavy hitters' for 8-bit systems: 128, 64, 32, 16, 8, 4, 2, 1. Look at the binary string 11010110. Ignore the zeros. Add the heavy hitters where the 1s sit: 128 + 64 + 16 + 4 + 2 = 214. For 16-bit numbers, memorize the upper-byte multipliers (256, 512, 1024, etc.) or simply convert the two 8-bit halves separately and multiply the high byte by 256.