Skip to content

Instantly share code, notes, and snippets.

@selftaught
Last active November 17, 2019 16:00
Show Gist options
  • Save selftaught/9e83ae981368aaa2944681e312ee03cb to your computer and use it in GitHub Desktop.
Save selftaught/9e83ae981368aaa2944681e312ee03cb to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>
void print_bits (uint8_t vals);
void bitwise_and ();
void bitwise_and_assign ();
void bitwise_or ();
void bitwise_or_assign ();
void bitwise_not ();
void bitwise_xor ();
void bitwise_lshift ();
void bitwise_rshift ();
int main (int argc, char** argv) {
time_t t;
srand((unsigned)time(&t));
bitwise_and ();
bitwise_or ();
bitwise_and_assign();
bitwise_or_assign ();
bitwise_not ();
bitwise_xor ();
bitwise_lshift ();
bitwise_rshift ();
return 0;
}
void rand_u8 (uint8_t* ptr) {
*ptr = (rand() % 255);
}
void print_bits (uint8_t val) {
printf("\tval (%-3u) bits: ", val);
uint8_t max_pow = 1 << (sizeof(uint8_t) * 8 - 1);
for (int i = 0; i < sizeof(uint8_t) * 8; i++) {
int res = (val & max_pow);
printf("\e[%dm%u\e[0m", res ? 34 : 91, res ? 1 : 0);
val = val << 1;
}
printf("\n");
}
void bitwise_and() {
printf("\e[91m%s\e[0m\n", "BITWISE AND ( & )");
printf("\n bit a | bit b | a & b\n");
printf(" ------+-------+--------\n");
printf(" 0 + 0 | 0\n" );
printf(" ------+-------+--------\n");
printf(" 0 + 1 | 0\n" );
printf(" ------+-------+--------\n");
printf(" 1 + 1 | 1\n" );
printf(" ------+-------+--------\n");
for (uint8_t i = 0; i < 5; i++) {
uint8_t lval; rand_u8(&lval);
uint8_t rval; rand_u8(&rval);
uint8_t res = (uint8_t)(lval & rval);
printf("\n\e[92m%-2u\e[0m & %u = %u\n\n", rval, lval, res);
print_bits(lval);
print_bits(rval);
print_bits(res);
printf("\n");
}
}
void bitwise_and_assign() {
printf("\e[91m%s\e[0m\n", "BITWISE AND ASSIGN ( &= )");
// @TODO: UPDATE ME - rows are c/p'd
printf("\n bit a | bit b | a &= b\n");
printf(" ------+-------+---------\n");
printf(" 0 + 0 | 0\n" );
printf(" ------+-------+---------\n");
printf(" 0 + 1 | 1\n" );
printf(" ------+-------+---------\n");
printf(" 1 + 0 | 1\n" );
printf(" ------+-------+---------\n");
printf(" 1 + 1 | 1\n" );
printf(" ------+-------+---------\n");
for (uint8_t i = 0; i < 5; i++) {
uint8_t lval; rand_u8(&lval);
uint8_t rval; rand_u8(&rval);
uint8_t res = (uint8_t)(lval &= rval);
printf("\n\e[92m%-2u\e[0m &= %u = %u\n\n", rval, lval, res);
print_bits(lval);
print_bits(rval);
print_bits(res);
printf("\n");
}
}
void bitwise_or() {
printf("\e[91m%s\e[0m\n", "BITWISE OR ( | )");
printf("\n bit a | bit b | a | b\n");
printf(" ------+-------+---------\n");
printf(" 0 + 0 | 0\n" );
printf(" ------+-------+---------\n");
printf(" 0 + 1 | 1\n" );
printf(" ------+-------+---------\n");
printf(" 1 + 0 | 1\n" );
printf(" ------+-------+---------\n");
printf(" 1 + 1 | 1\n" );
printf(" ------+-------+---------\n");
for (uint8_t i = 0; i < 5; i++) {
uint8_t lval; rand_u8(&lval);
uint8_t rval; rand_u8(&rval);
uint8_t res = (uint8_t)(lval | rval);
printf("\n\e[92m%-2u\e[0m | %u = %u\n\n", rval, lval, res);
print_bits(lval);
print_bits(rval);
print_bits(res);
printf("\n");
}
}
void bitwise_or_assign() {
printf("\e[91m%s\e[0m\n", "BITWISE OR ASSIGN ( |= )");
for (uint8_t i = 0; i < 5; i++) {
uint8_t lval; rand_u8(&lval);
uint8_t rval; rand_u8(&rval);
uint8_t res = (uint8_t)(lval |= rval);
printf("\n\e[92m%-2u\e[0m |= %u = %u\n\n", rval, lval, res);
print_bits(lval);
print_bits(rval);
print_bits(res);
printf("\n");
}
}
void bitwise_not() {
printf("\e[91m%s\e[0m\n", "BITWISE NOT ( ~ )");
for (uint8_t i = 0; i < 5; i++) {
uint8_t lval; rand_u8(&lval);
uint8_t res = (uint8_t)(~lval);
printf("\n\e[92m~%-2u\e[0m = %u\n\n", lval, res);
print_bits(lval);
print_bits(res);
printf("\n");
}
}
void bitwise_xor() {
printf("\e[91m%s\e[0m\n", "BITWISE XOR ( ^ )");
printf("\n bit a | bit b | a ^ b\n");
printf(" ------+-------+---------\n");
printf(" 0 + 0 | 0\n" );
printf(" ------+-------+---------\n");
printf(" 0 + 1 | 1\n" );
printf(" ------+-------+---------\n");
printf(" 1 + 0 | 1\n" );
printf(" ------+-------+---------\n");
printf(" 1 + 1 | 0\n" );
printf(" ------+-------+---------\n");
for (uint8_t i = 0; i < 5; i++) {
uint8_t lval; rand_u8(&lval);
uint8_t rval; rand_u8(&rval);
uint8_t res = (uint8_t)(lval ^ rval);
printf("\n\e[92m%-2u\e[0m ^ %u = %u\n\n", rval, lval, res);
print_bits(lval);
print_bits(rval);
print_bits(res);
printf("\n");
}
}
void bitwise_lshift() {
printf("\e[91m%s\e[0m\n", "BITWISE SHIFT LEFT ( << 1 )");
uint8_t val; rand_u8(&val);
for (uint8_t i = 0; i < 8; i++) {
uint8_t res = (uint8_t)(val << (i + 1));
printf("\n\e[92m%-2u\e[0m << 1 = %u\n\n", val, res);
print_bits(val);
print_bits(res);
printf("\n");
}
}
void bitwise_rshift() {
printf("\e[91m%s\e[0m\n", "BITWISE SHIFT RIGHT ( >> 1 )");
uint8_t val; rand_u8(&val);
for (uint8_t i = 0; i < 8; i++) {
uint8_t res = (uint8_t)(val >> (i + 1));
printf("\n\e[92m%-2u\e[0m >> 1 = %u\n\n", val, res);
print_bits(val);
print_bits(res);
printf("\n");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment