Basic Concepts
Bit
- The basic unit of computer memory
- A binary digit, can only be 0 or 1
- Similar to an electronic switch: Off (0) or On (1)
Byte
- Typically consists of 8 bits
- Definition of a byte in C++: At least enough adjacent bits to hold the basic character set
- May vary across different systems (8 bits, 16 bits, 32 bits)
Combination Calculation
The number of combinations for n bits = 2ⁿ
| Number of Bits | Number of Combinations | Unsigned Range | Signed Range |
|---|---|---|---|
| 8 bits | 256 | 0-255 | -128 to 127 |
| 16 bits | 65,536 | 0-65,535 | -32,768 to 32,767 |
| 32 bits | 4,294,967,296 | 0-4,294,967,295 | -2,147,483,648 to 2,147,483,647 |
| 64 bits | 18,446,744,073,709,551,616 | 0-18,446,744,073,709,551,615 | -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
Code Example
#include <iostream>
#include <climits> // Includes constants like CHAR_BIT
#include <bitset> // For binary display
#include <iomanip> // For formatted output
using namespace std;
int main() {
// 1. Display basic system information
cout << "=== System Bits and Bytes Information ===" << endl;
cout << "Current system bits per byte: " << CHAR_BIT << " bits" << endl;
cout << "Size of char type: " << sizeof(char) << " bytes" << endl;
cout << "Size of int type: " << sizeof(int) << " bytes" << endl;
cout << "Size of long long type: " << sizeof(long long) << " bytes" << endl;
// 2. Demonstrate value ranges for different bit sizes
cout << "\n=== Value Ranges for Different Bit Sizes ===" << endl;
cout << "8 bits (char): " << CHAR_MIN << " to " << CHAR_MAX << endl;
cout << "16 bits (short): " << SHRT_MIN << " to " << SHRT_MAX << endl;
cout << "32 bits (int): " << INT_MIN << " to " << INT_MAX << endl;
cout << "64 bits (long long): " << LLONG_MIN << " to " << LLONG_MAX << endl;
// 3. Demonstrate combination calculations
cout << "\n=== Combination Calculations ===" << endl;
cout << "1 bit combinations: " << (1 << 1) << endl;
cout << "8 bits combinations: " << (1LL << 8) << endl;
cout << "16 bits combinations: " << (1LL << 16) << endl;
cout << "32 bits combinations: " << (1LL << 32) << endl;
cout << "64 bits combinations: " << (1LL << 63) * 2 << endl; // Avoid overflow
// 4. Binary representation of actual values
cout << "\n=== Binary Representation of Values ===" << endl;
unsigned char byteValue = 42; // 8-bit unsigned number
short shortValue = 1000; // 16-bit signed number
int intValue = 100000; // 32-bit signed number
cout << "Decimal 42 in binary: " << bitset<8>(byteValue) << endl;
cout << "Decimal 1000 in binary: " << bitset<16>(shortValue) << endl;
cout << "Decimal 100000 in binary: " << bitset<32>(intValue) << endl;
// 5. Bitwise operation examples
cout << "\n=== Bitwise Operation Examples ===" << endl;
unsigned char a = 0b10101010; // 170
unsigned char b = 0b11001100; // 204
cout << "a = " << bitset<8>(a) << " (" << (int)a << ")" << endl;
cout << "b = " << bitset<8>(b) << " (" << (int)b << ")" << endl;
cout << "a AND b = " << bitset<8>(a && b) << " (" << (int)(a && b) << ")" << endl;
cout << "a OR b = " << bitset<8>(a | b) << " (" << (int)(a | b) << ")" << endl;
cout << "a XOR b = " << bitset<8>(a ^ b) << " (" << (int)(a ^ b) << ")" << endl;
cout << "NOT a = " << bitset<8>(~a) << " (" << (int)(~a) << ")" << endl;
// 6. Shift operations
cout << "\n=== Shift Operations ===" << endl;
unsigned char x = 0b00001111; // 15
cout << "Original value: " << bitset<8>(x) << " (" << (int)x << ")" << endl;
cout << "Left shift 2 bits: " << bitset<8>(x << 2) << " (" << (int)(x << 2) << ")" << endl;
cout << "Right shift 2 bits: " << bitset<8>(x >> 2) << " (" << (int)(x >> 2) << ")" << endl;
// 7. Practical application: Permission system
cout << "\n=== Practical Application: Permission System ===" << endl;
// Using bits to represent permissions
const unsigned char READ = 1 << 0; // 00000001
const unsigned char WRITE = 1 << 1; // 00000010
const unsigned char EXECUTE = 1 << 2; // 00000100
const unsigned char DELETE = 1 << 3; // 00001000
unsigned char userPermissions = READ | WRITE; // Has read and write permissions
cout << "User permissions: " << bitset<8>(userPermissions) << endl;
cout << "Readable: " << ((userPermissions && READ) ? "Yes" : "No") << endl;
cout << "Writable: " << ((userPermissions && WRITE) ? "Yes" : "No") << endl;
cout << "Executable: " << ((userPermissions && EXECUTE) ? "Yes" : "No") << endl;
cout << "Deletable: " << ((userPermissions && DELETE) ? "Yes" : "No") << endl;
// Add execute permission
userPermissions |= EXECUTE;
cout << "\nAfter adding execute permission: " << bitset<8>(userPermissions) << endl;
cout << "Executable: " << ((userPermissions && EXECUTE) ? "Yes" : "No") << endl;
// 8. Memory unit conversion
cout << "\n=== Memory Unit Conversion ===" << endl;
cout << "1 KB = 1024 bytes" << endl;
cout << "1 MB = 1024 KB = " << (1024LL * 1024) << " bytes" << endl;
cout << "1 GB = 1024 MB = " << (1024LL * 1024 * 1024) << " bytes" << endl;
cout << "1 TB = 1024 GB = " << (1024LL * 1024 * 1024 * 1024) << " bytes" << endl;
// 9. Comparison of large number handling capabilities
cout << "\n=== Comparison of Large Number Handling Capabilities ===" << endl;
long long worldPopulation = 7800000000LL; // 7.8 billion - can be handled by long long
long long starsInGalaxy = 100000000000LL; // 100 billion - can be handled by long long
unsigned long long largeNumber = 18446744073709551615ULL; // maximum value of unsigned long long
cout << "World population: " << worldPopulation << " (can be stored in long long)" << endl;
cout << "Number of stars in the galaxy: " << starsInGalaxy << " (can be stored in long long)" << endl;
cout << "Maximum value of unsigned long long: " << largeNumber << endl;
// 10. Overflow check
cout << "\n=== Overflow Check ===" << endl;
unsigned char maxByte = 255;
cout << "Maximum value of unsigned char: " << (int)maxByte << endl;
maxByte += 1; // Overflow
cout << "After adding 1: " << (int)maxByte << " (overflow back to 0)" << endl;
char maxSignedByte = 127;
cout << "Maximum value of signed char: " << (int)maxSignedByte << endl;
maxSignedByte += 1; // Overflow
cout << "After adding 1: " << (int)maxSignedByte << " (overflow becomes minimum value)" << endl;
return 0;
}
Advanced Bit Operation Example
#include <iostream>
#include <bitset>
using namespace std;
// Bit operation utility class
class BitUtils {
public:
// Set a specific bit to 1
static unsigned int setBit(unsigned int value, int position) {
return value | (1 << position);
}
// Clear a specific bit (set to 0)
static unsigned int clearBit(unsigned int value, int position) {
return value & ~(1 << position);
}
// Toggle a specific bit (0 becomes 1, 1 becomes 0)
static unsigned int toggleBit(unsigned int value, int position) {
return value ^ (1 << position);
}
// Check if a specific bit is 1
static bool checkBit(unsigned int value, int position) {
return (value >> position) & 1;
}
// Count the number of 1s (population count)
static int countBits(unsigned int value) {
int count = 0;
while (value) {
count += value & 1;
value >>= 1;
}
return count;
}
// Display the binary representation of a value
static void showBinary(unsigned int value, int bits = 32) {
cout << bitset<32>(value) << " (Decimal: " << value << ")" << endl;
}
};
int main() {
cout << "=== Advanced Bit Operation Example ===" << endl;
unsigned int number = 0b1010; // Decimal 10
cout << "Original value: ";
BitUtils::showBinary(number);
// Set the 2nd bit
number = BitUtils::setBit(number, 2);
cout << "After setting the 2nd bit: ";
BitUtils::showBinary(number);
// Clear the 1st bit
number = BitUtils::clearBit(number, 1);
cout << "After clearing the 1st bit: ";
BitUtils::showBinary(number);
// Toggle the 3rd bit
number = BitUtils::toggleBit(number, 3);
cout << "After toggling the 3rd bit: ";
BitUtils::showBinary(number);
// Check each bit
for (int i = 0; i < 8; i++) {
cout << "Bit " << i << ": " << (BitUtils::checkBit(number, i) ? "1" : "0") << endl;
}
// Count the number of 1s
cout << "Number of 1s: " << BitUtils::countBits(number) << endl;
return 0;
}
Practical Application: Color Processing
#include <iostream>
#include <bitset>
using namespace std;
// RGB Color Processing Class (using 32-bit integer storage)
class Color {
private:
unsigned int value; // Format: 0xRRGGBB
public:
Color(unsigned char r, unsigned char g, unsigned char b) {
value = (r << 16) | (g << 8) | b;
}
unsigned char getRed() const {
return (value >> 16) & 0xFF;
}
unsigned char getGreen() const {
return (value >> 8) & 0xFF;
}
unsigned char getBlue() const {
return value & 0xFF;
}
void setRed(unsigned char r) {
value = (value & 0x00FFFF) | (r << 16);
}
void setGreen(unsigned char g) {
value = (value & 0xFF00FF) | (g << 8);
}
void setBlue(unsigned char b) {
value = (value & 0xFFFF00) | b;
}
void display() const {
cout << "RGB(" << (int)getRed() << ", "
<< (int)getGreen() << ", "
<< (int)getBlue() << ")" << endl;
cout << "Hexadecimal: 0x" << hex << uppercase << value << dec << nouppercase << endl;
cout << "Binary: " << bitset<24>(value) << endl;
}
};
int main() {
cout << "=== Practical Application: Color Processing ===" << endl;
Color red(255, 0, 0);
Color green(0, 255, 0);
Color blue(0, 0, 255);
cout << "Red: "; red.display();
cout << "Green: "; green.display();
cout << "Blue: "; blue.display();
// Mix colors
Color purple(128, 0, 128);
cout << "Purple: "; purple.display();
return 0;
}
Output Example
=== System Bits and Bytes Information ===
Current system bits per byte: 8 bits
Size of char type: 1 byte
Size of int type: 4 bytes
Size of long long type: 8 bytes
=== Value Ranges for Different Bit Sizes ===
8 bits (char): -128 to 127
16 bits (short): -32768 to 32767
32 bits (int): -2147483648 to 2147483647
64 bits (long long): -9223372036854775808 to 9223372036854775807
=== Combination Calculations ===
1 bit combinations: 2
8 bits combinations: 256
16 bits combinations: 65536
32 bits combinations: 4294967296
64 bits combinations: 18446744073709551616
=== Binary Representation of Values ===
Decimal 42 in binary: 00101010
Decimal 1000 in binary: 0000001111101000
Decimal 100000 in binary: 00000000000000011000011010100000
Key Points Summary
- Bits are fundamental: All data is ultimately represented as bits in a computer
- Byte size can vary: In C++, the size of a byte depends on the implementation, typically 8 bits
- Combination explosion: Each additional bit doubles the number of possible combinations
- Be cautious of overflow: Values exceeding type ranges can lead to overflow
- Bitwise operations are powerful: They allow efficient low-level operations
- Wide practical applications: Such as permission control, color processing, data compression, etc.
Understanding the concepts of bits and bytes is crucial for writing efficient C++ programs and performing low-level programming.