1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>
#include <stdint.h>
#include <stdbool.h>
#include "print_bits.h"
bool get_bit(uint8_t byte, int bit_idx) {
uint8_t mask = 0x01 << bit_idx; // single bit 1 set
// bit_idx 0s to the right
uint8_t set_bit = byte & mask; // 0 if bit unset
// mask if bit is set
return set_bit == mask;
}
uint8_t set_bit(uint8_t byte, int bit_idx, bool new_value) {
uint8_t mask = 0x01 << bit_idx; // 1 in exactly 1 bit
// if the bit is at the proper value, no change needed
// if the bit is the wrong value, XOR will toggle it
if (get_bit(byte, bit_idx) != new_value) {
byte ^= mask;
}
return byte;
}
uint8_t get_bits(uint8_t byte, int start_bit, int end_bit) {
uint8_t mask = 0xff;
// make the proper number of 1s is set
int num_bits_needed = end_bit - start_bit + 1;
int total_bits = sizeof(byte) * 8;
// has proper number of 1s, but wrong position
mask = mask >> (total_bits - num_bits_needed);
// get ones into proper position
mask = mask << start_bit;
uint8_t gotten_bits = byte & mask;
gotten_bits >>= start_bit;
// gotten_bits = gotten_bits >> start_bit
return gotten_bits;
}
uint8_t set_bits(uint8_t byte, int bit_idx,
uint8_t new_bits, int num_bits) {
return byte;
}
#define log_bool(b) printf("(%s) == %s\n", (#b), b ? "true" : "false")
int main(int argc, char* argv[]) {
uint8_t bits = 0x5f; // 0b01011111
print_bits_plain(bits);
log_bool(get_bit(bits, 0));
log_bool(get_bit(bits, 1));
log_bool(get_bit(bits, 2));
log_bool(get_bit(bits, 3));
log_bool(get_bit(bits, 4));
log_bool(get_bit(bits, 5));
log_bool(get_bit(bits, 6));
log_bool(get_bit(bits, 7));
print_bits_plain(bits);
uint8_t updated_bits = set_bit(bits, 5, true);
print_bits_plain(updated_bits);
print_bits_plain(bits);
updated_bits = set_bit(bits, 2, false);
print_bits_plain(updated_bits);
print_bits_plain(bits);
print_bits_plain(get_bits(bits, 2, 7));
return EXIT_SUCCESS;
}
/* vim: set tabstop=4 shiftwidth=4 fileencoding=utf-8 noexpandtab: */
|
© Copyright 2022 Alexander J. Quinn This content is protected and may not be shared, uploaded, or distributed.