print binary using shift and masking

8 bit int

lets play with small number first, imagine we want print 200 into binary, which is 0b11001000, this is how I do

step 0

identify how many bits we need? say, char has 1 byte, int has 4 byte, long long has 8 byte. just multiply it with 8. you'll get the bit.

  • 1 * 8 = 8 bit
  • 4 * 8 = 32 bit
  • 8 * 8 = 64 bit

step 1

mask, lets see this pattern

0b11001000
0b10000000
---------- &
0b10000000

see? 0b10000000, which is 0x80, what about 0x8? its 0x1000. find that? by shift left the bit, we turn 0x8 into 0x80

lets follow this pattern

  • 0x8 << 0 = 0x8 (4 bit)
  • 0x8 << 4 = 0x80 (8 bit) <--- this is mask
  • 0x8 << 8 = 0x800 (12 bit)
  • 0x8 << 12 = 0x8000 (16 bit) <--- this is mask
  • 0x8 << 16 = 0x80000 (20 bit)

when I want mask 8 bit int? the mask is 0x80 because its perfectly fit 0b10000000, if I want mask 16 bit int? the mask is 0x8000, because its fit 0b1000000000000000 16 bit int, can filter the MSB

conlusion: the mask that we will use, is

0x8 << BIT_SIZE - 4

SAY, BIT_SIZE is 8 (eight bit int), 8 - 4 is 4, 0x8 << 4 = 0x80 same thing with

BIT_SIZE is 16, then 16 - 4 = 12, 0x8 << 12 = 0x8000

okay, the mask has been clearly explained

step 3, shifting

say, I have 8 bit int. 0b11100011, when I mask it

n = 1

0b11100011
0b10000000
---------- &
0b10000000

lets continue shift to left

n = 2

0b11000110
0b10000000
---------- &
0b10000000

n = 3

0b10001100
0b10000000
---------- &
0b10000000

n = 4

0b00011000
0b10000000
---------- &
0b0000000

n = 5

0b00110000
0b10000000
---------- &
0b00000000

n = 6

0b01100000
0b10000000
---------- &
0b00000000

n = 7

0b11000000
0b10000000
---------- &
0b10000000

n = 8

0b10000000
0b10000000
---------- &
0b10000000

obtaining result

lets see this pattern

0b10000000 0b10000000 0b10000000 0b0000000 0b00000000 0b00000000 0b10000000 0b10000000

if we use if else, to match whatever one byte is same as 0b10000000 or not, we will get result 1110 0011

YES, we successfully turn int 8 bit into binary presentation

example

#include <stddef.h>
#include <stdio.h>

int main() {
        long long x = 3;

        size_t BIT_SIZE = sizeof(x) * 8;
        printf("size: %zu bit\n", BIT_SIZE);

        long long big_mask = (0x8ULL << (BIT_SIZE - 4));

        int counter = 0;
        for (int i = 0; i < BIT_SIZE; i++) {
                if (i % 4 == 0 && i != 0) {
                        printf("  ");
                }

                if (i % 16 == 0 && i != 0) {
                        printf("\n");
                }

                
                long int y = x & big_mask;
                printf("%d ", y == big_mask ? 1 : 0);
                x = x << 1;
        }
       
}

image