Bytes vs Bits: Why Your Computer Thinks in Groups of 8
Your internet speed is measured in megabits per second. Your file sizes show up in megabytes. Same prefix, different unit — and getting them mixed up means thinking your 100 Mbps connection is 8 times slower than it actually is.
The distinction runs deeper than marketing. Bits and bytes shape how CPUs address memory, how networks send packets, and how your code reads data. Here is the difference and why it matters when you're writing bitwise operations.
The Basics: What Is a Bit?
A bit (binary digit) is the smallest unit of data. It holds exactly one value: 0 or 1. That is it. One bit can represent two states — on/off, true/false, yes/no.
In C, a bit is not directly addressable. You cannot write int* ptr = &some_bit. The smallest addressable unit is a byte. You manipulate individual bits through bitwise operators — AND to clear, OR to set, XOR to toggle.
What Is a Byte?
A byte is 8 bits. This is the standard across every modern architecture — x86, ARM, RISC-V. One byte can hold 256 different values (2^8), from 0 to 255 unsigned, or -128 to 127 signed.
| Unit | Bits | Values | Typical Use |
|---|---|---|---|
| Bit | 1 | 2 | Flags, boolean state |
| Nibble | 4 | 16 | One hex digit (0-F) |
| Byte | 8 | 256 | Characters, small integers |
| Word (varies) | 16/32/64 | varies | CPU's natural data size |
Why 8 Bits? A Quick History
Before the 1960s, "byte" meant anywhere from 4 to 12 bits. The PDP-8 had 12-bit bytes. The CDC 6600 used 6-bit characters. It was chaos.
The IBM System/360 (1964) standardized the 8-bit byte. It was a pragmatic choice:
- 256 characters was enough for ASCII (128) plus room for extended characters and control codes
- Powers of two — 8 bits, 16 bits, 32 bits, 64 bits. Nice, clean doubling
- EBCDIC compatibility — IBM's existing encoding needed at least 8 bits
- Hardware efficiency — 8-bit registers were cheap to manufacture
Every CPU and OS since has inherited this choice. The x86 AL register is 8 bits. C's char is 8 bits. Network protocols specify fields in 8-bit octets. You cannot escape the 8-bit byte.
Working With Bits Inside Bytes
Since you cannot address individual bits directly, you use bitwise operations to pick them out of bytes. This is where the bitwise calculator on this site becomes useful — type in numbers and see which bits are set.
// Extract bit 3 from a byte (0-indexed, bit 0 is LSB)
int bit3 = (value >> 3) & 1;
// Set bit 5
value |= (1 << 5);
// Clear bit 2
value &= ~(1 << 2);
// Toggle bit 7
value ^= (1 << 7);
Bits vs Bytes: The Units People Get Wrong
| Abbreviation | Means | Used For |
|---|---|---|
| b (lowercase) | bits | Network speed: Mbps, Gbps |
| B (uppercase) | bytes | File size: MB, GB, TB |
| Mbps | Megabits per second | Internet connection speed |
| MB/s | Megabytes per second | Download speed, disk I/O |
The conversion: 1 byte = 8 bits. A 100 Mbps connection downloads at roughly 12.5 MB/s in theory (less in practice due to protocol overhead).
Byte Ordering: Little-Endian vs Big-Endian
When a value spans more than one byte, the order matters. In little-endian (x86, most ARM), the least significant byte comes first. In big-endian (network byte order, some embedded systems), the most significant byte comes first.
// The value 0x12345678 stored as 4 bytes:
// Big-endian: 12 34 56 78 (MSB first, "natural" reading)
// Little-endian: 78 56 34 12 (LSB first, x86 default)
// C code to check your machine's endianness:
int x = 1;
if (*(char*)&x == 1)
printf("Little-endian\n"); // Most x86/ARM machines
else
printf("Big-endian\n");
This matters when you write binary data to a file, send packets over a network, or read sensor data from embedded hardware. If you get it wrong, your numbers will be byteswapped — and that is a nightmare to debug.