Print A Number In Binary In C

4 min read

Print a Number in Binary in C

Printing a number in binary is a common task when learning low‑level programming, debugging bit‑wise operations, or preparing data for hardware interfaces. Here's the thing — although the C standard library does not provide a direct format specifier for binary output (like %b in some languages), you can easily achieve the result using bitwise manipulation, loops, or recursion. This article explains the underlying concepts, walks through several practical implementations, and highlights when each approach is most appropriate.

Worth pausing on this one.


Understanding Binary Representation in C

Before writing code, it helps to recall how integers are stored in memory. In most modern systems, an int occupies 32 bits (4 bytes) and uses two’s‑complement notation for negative values. Each bit represents a power of two, starting from the least‑significant bit (LSB) on the right.

The official docs gloss over this. That's a mistake.

0000 0000 0000 0000 0000 0000 0000 1101

When we “print a number in binary,” we simply traverse these bits from the most‑significant bit (MSB) to the LSB and output 0 or 1 accordingly.


Method 1: Iterative Bitwise Loop

The most straightforward way is to shift the number right one bit at a time and examine the least‑significant bit after each shift. By iterating from the highest bit position down to zero, we avoid leading‑zero suppression issues.

Step‑by‑step Explanation

  1. Determine the width of the type (e.g., sizeof(int) * CHAR_BIT gives 32 for a typical int).
  2. Start a loop at width‑1 and decrement to 0.
  3. Inside the loop, right‑shift the number by the current index and mask with 1 ((n >> i) & 1) to isolate the bit.
  4. Print the resulting 0 or 1.
  5. Optionally insert a space every 4 bits for readability.

Code Example

#include 
#include    // for CHAR_BIT

void printBinary(unsigned int n) {
    int width = sizeof(n) * CHAR_BIT;   // usually 32
    for (int i = width - 1; i >= 0; --i) {
        putchar(((n >> i) & 1) ? '1' : '0');
        if (i % 4 == 0 && i != 0)   // optional grouping
            putchar(' ');
    }
    putchar('\n');
}

The official docs gloss over this. That's a mistake.

int main(void) {
    unsigned int num = 13;
    printf("Binary of %u: ", num);
    printBinary(num);
    return 0;
}

Output

Binary of 13: 0000 0000 0000 0000 0000 0000 0000 1101

Why it works

  • The expression (n >> i) & 1 shifts the bit of interest to the LSB position and then extracts it.
  • Looping from the most‑significant bit guarantees that the most significant 1 (if any) appears first, preserving the conventional left‑to‑right binary notation.

Method 2: Recursive Approach

Recursion offers a more compact representation, especially when you prefer not to manage loop counters explicitly. The idea is to print the binary of n/2 first, then output the remainder n % 2.

How Recursion Builds the String

  • The base case occurs when n is 0 or 1; we simply print that digit.
  • For larger numbers, the function calls itself with n >> 1 (equivalent to n/2 for unsigned ints) before printing the current LSB.
  • Because the recursive call returns before the current digit is printed, the output appears in the correct order (MSB to LSB).

Code Example

#include 

void printBinaryRec(unsigned int n) {
    if (n >> 1)               // if there are more bits left
        printBinaryRec(n >> 1);
    putchar((n & 1) ? '1' : '0');
}

int main(void) {
    unsigned int num = 255;
    printf("Binary of %u: ", num);
    printBinaryRec(num);
    putchar('\n');
    return 0;
}

Output

Binary of 255: 11111111

Advantages & Caveats

  • Advantage: Minimal boilerplate; the function naturally handles leading zeros (they are omitted unless you explicitly print them).
  • Caveat: For very large integers (e.g., 64‑bit values) the recursion depth equals the number of bits, which is still safe on most systems (max 64 calls). That said, if you need to print thousands of bits (e.g., big‑integer libraries), an iterative loop is preferable to avoid stack overflow.

Method 3: Using a Lookup Table for Nibbles

When performance matters—such as in tight loops or embedded systems—you can pre‑compute the binary strings for each 4‑bit nibble (0‑15) and then output them in sequence. This reduces the number of bitwise operations per bit to a simple table lookup.

Implementation Steps

  1. Create an array const char *nibble[16] where each entry holds the four‑character string "0000" through "1111".
  2. Process the number nibble‑by‑nibble from the most significant to the least.
  3. For the first nibble, suppress leading zeros if you want a compact representation; otherwise, print all nibbles directly.

Code Example

#include 

static const char *nibble[16] = {
    "0000","0001","0010","0011",
    "0100","0101","0110","0111",
    "1000","1001","1010","1011",
    "1100","1101","1110","1111"
};

void printBinaryNibble(unsigned int n) {
    int width = sizeof(n) * 8;          // total bits
    int nibbles = width / 4;            // number of 4‑bit groups
    int leading = 1;                    // flag to skip leading zeros

    for (int i = nibbles - 1; i >= 0; --i) {
        unsigned int val = (n >> (i * 4)) & 0xF; // extract nibble
        if (leading && val == 0 && i != 0) {
Fresh from the Desk

Hot off the Keyboard

Explore a Little Wider

From the Same World

Thank you for reading about Print A Number In Binary In C. We hope the information has been useful. Feel free to contact us if you have any questions. See you next time — don't forget to bookmark!
⌂ Back to Home