1
0
jcktrue.dk/content/post/bit-magic/index.md

74 lines
1.5 KiB
Markdown
Raw Normal View History

2020-06-25 20:43:14 +00:00
---
title: "Bit magic in C (and C++)"
2020-08-02 12:48:01 +00:00
subtitle: "Tips and trick for embedded C/C++"
2020-08-02 12:44:30 +00:00
summary: "Tips and trick for embedded C/C++"
2020-06-25 20:43:14 +00:00
date: 2020-06-13T19:01:19+02:00
highlight: true
2021-07-28 12:42:22 +00:00
math: true
2020-06-25 20:43:14 +00:00
---
# Set a bit
```c
// Set one bit high at position "bit" in input and store to output
output = input | (1 << bit);
// Shorthand
variable |= (1 << bit);
2020-07-05 09:14:47 +00:00
// Multiple bits
variable |= (0b101 << bit);
2020-06-25 20:43:14 +00:00
```
# Clear a bit
```c
// Clear one bit high at position "bit" in input and store to output
output = input & ~(1 << bit);
// Shorthand
variable &= ~(1 << bit);
2020-07-05 09:14:47 +00:00
// Multiple bits
variable &= ~(0b101 << bit);
2020-06-25 20:43:14 +00:00
```
# Toggle a bit
```c
// Clear one bit high at position "bit" in input and store to output
output = x ^ (1 << bit);
// Shorthand
variable ^= (1 << bit);
2020-07-05 09:14:47 +00:00
// Multiple bits
variable ^= (0b101 << bit);
2020-08-02 12:34:35 +00:00
```
# Math
```c
// Division using bitshift
output = input >> 1; // Divide by 2
output = input >> 2; // Divide by 4
output = input >> 3; // Divide by 8
// Multiply using bitshifting
output = input << 1; // Multiply by 2
output = input << 2; // Multiply by 4
output = input << 3; // Multiply by 8
```
# Set X number of bits high.
```c
output = (0b1 << X) -1;
```
2021-07-28 12:42:22 +00:00
# Minimum required bits
$$bits = { log(number) \over log(2) }$$
Since you can not use fractions of a bit the number should be rounded up.
2020-08-02 12:44:30 +00:00
# Miscellaneous
2020-08-02 12:34:35 +00:00
```c
// Check if number is ODD
if( (num & 1) == 1) {};
// Flip signed integer
num = ~num + 1;
2021-07-28 12:42:22 +00:00
// Is an integer a power of two?
2020-08-02 12:34:35 +00:00
num > 0 && (num & (num - 1)) == 0;
2021-07-28 12:42:22 +00:00
//Clear all bits from 0 to N
mask = ~((1 << n+1 ) - 1);
x &= mask;
2020-06-25 20:43:14 +00:00
```