-
-
Save selftaught/9e83ae981368aaa2944681e312ee03cb to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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