4Given a power of 2, work out the number to shift right by to do a divide by the number, or shift left to multiply.
5@param a power of 2, or any other number for that matter
6@return the number of trailing zeros on the right hand end
7*/
8
9/* NOTE: previous version is super-nifty, but pulls in software float code on AVR (the platform where it makes a difference), leading to bloat and a compile time warning.
10 * Sine the only use-case I could find works on a compile-time constant (template-parameter), I added a constexpr function in mozzi_utils.h, instead. I renamed it, too,
11 * so, we'll learn about any use-case outside of this scope. If there are no reports of breakage, the following can probably be removed for good.
12long trailingZeros(unsigned long v) {
13 // find the number of trailing zeros in v, from http://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightFloatCast
14 // there are faster methods on the bit twiddling site, but this is short
15 float f = (float)(v & -v); // cast the least significant bit in v to a float
16 return (*(uint32_t *)&f >> 23) - 0x7f;
17}
18
19Here's an alternate, trivial version:
20uint8_t trailingZeros(uint16_t v) {
21 uint8_t ret = 0;
22 while ((v % 2) == 0) {
23 v = v >> 1;
24 ++ret;
25 }
26 return ret;
27} */
28
29
30/** Convert BPM to milliseconds, which can be used to set the delay between beats for Metronome.