SETTING BINARY VIA RGB EXAMPLE
Setting 0bRGB (3-bit Binary Color)
In this example, each of R, G, and B can be either off (0
) or on (1
). This creates a simple 3-bit binary representation:
# Example: All colors ON (R=1, G=1, B=1) >>> R = 1; G = 1; B = 1 >>> bin(R << 2 | G << 1 | B) '0b111' # Same example, represented in hexadecimal >>> hex(R << 2 | G << 1 | B) '0x7'
Setting 0bRRRRRRRRGGGGGGGGBBBBBBBB (24-bit RGB Color)
In this case, each R, G, and B can take a value in the range of 0
to 255
(8 bits each). The combined 24 bits represent the full RGB color in binary or hexadecimal:
# Example: Full white (R=255, G=255, B=255) >>> R = 255; G = 255; B = 255 >>> bin(R << 16 | G << 8 | B) '0b111111111111111111111111' >>> hex(R << 16 | G << 8 | B) '0xffffff' # Example: Custom color (R=255, G=100, B=255) >>> R = 255; G = 100; B = 255 >>> hex(R << 16 | G << 8 | B) '0xff64ff'
EXTRACTING RGB VALUES
My Initial Implementation
Below is an attempt to extract R, G, and B values from a 24-bit hex color 0x123456
. Each color is isolated using a combination of bitwise AND (&
) and bitwise shift (>>
) operations.
Extracting as Hexadecimal:
# Blue (bits 0–7) >>> hex(0x123456 & 0xFF) '0x56' # Green (bits 8–15) >>> hex((0x123456 & 0xFF << 8) >> 8) '0x34' # Red (bits 16–23) >>> hex((0x123456 & 0xFF << 16) >> 16) '0x12'
Extracting as Decimal:
# Red >>> ((0x123456 & 0xFF << 16) >> 16) 18 # Green >>> ((0x123456 & 0xFF << 8) >> 8) 52 # Blue >>> (0x123456 & 0xFF) 86
Why This Needs Improvement
The above implementation has a subtle issue: operator precedence. The <<
operator has lower precedence than the &
operator. This means expressions like 0xFF << 8
are evaluated later than the masking (&
), leading to incorrect results.
Better Implementation
This corrected implementation ensures the precedence of operations is handled properly. Here’s the proper way to extract each color channel from 0x123456
:
# Red (bits 16–23) R = hex((0x123456 >> 16) & 0xFF) # Green (bits 8–15) G = hex((0x123456 >> 8) & 0xFF) # Blue (bits 0–7) B = hex(0x123456 & 0xFF)
Result (Hexadecimal):
- Red:
'0x12'
- Green:
'0x34'
- Blue:
'0x56'
To extract the values in decimal:
# Red R_dec = (0x123456 >> 16) & 0xFF # Green G_dec = (0x123456 >> 8) & 0xFF # Blue B_dec = 0x123456 & 0xFF
Result (Decimal):
- Red:
18
- Green:
52
- Blue:
86
Notes on the Correct Approach
- Shift First, Then Mask: Always shift bits to align the target color channel with the least significant byte before applying the mask (
& 0xFF
). - Hexadecimal and Decimal Conversions: After extracting, use
hex()
for hexadecimal representation or directly work with the decimal values.
This method ensures consistent and accurate extraction of color channels, avoiding any pitfalls caused by operator precedence.