diff options
Diffstat (limited to 'tmk_core/common/util.c')
-rw-r--r-- | tmk_core/common/util.c | 116 |
1 files changed, 69 insertions, 47 deletions
diff --git a/tmk_core/common/util.c b/tmk_core/common/util.c index 7e0d54299..f4f018de8 100644 --- a/tmk_core/common/util.c +++ b/tmk_core/common/util.c | |||
@@ -18,84 +18,106 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
18 | #include "util.h" | 18 | #include "util.h" |
19 | 19 | ||
20 | // bit population - return number of on-bit | 20 | // bit population - return number of on-bit |
21 | uint8_t bitpop(uint8_t bits) | 21 | uint8_t bitpop(uint8_t bits) { |
22 | { | ||
23 | uint8_t c; | 22 | uint8_t c; |
24 | for (c = 0; bits; c++) | 23 | for (c = 0; bits; c++) bits &= bits - 1; |
25 | bits &= bits - 1; | ||
26 | return c; | 24 | return c; |
27 | /* | 25 | /* |
28 | const uint8_t bit_count[] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; | 26 | const uint8_t bit_count[] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; |
29 | return bit_count[bits>>4] + bit_count[bits&0x0F] | 27 | return bit_count[bits>>4] + bit_count[bits&0x0F] |
30 | */ | 28 | */ |
31 | } | 29 | } |
32 | 30 | ||
33 | uint8_t bitpop16(uint16_t bits) | 31 | uint8_t bitpop16(uint16_t bits) { |
34 | { | ||
35 | uint8_t c; | 32 | uint8_t c; |
36 | for (c = 0; bits; c++) | 33 | for (c = 0; bits; c++) bits &= bits - 1; |
37 | bits &= bits - 1; | ||
38 | return c; | 34 | return c; |
39 | } | 35 | } |
40 | 36 | ||
41 | uint8_t bitpop32(uint32_t bits) | 37 | uint8_t bitpop32(uint32_t bits) { |
42 | { | ||
43 | uint8_t c; | 38 | uint8_t c; |
44 | for (c = 0; bits; c++) | 39 | for (c = 0; bits; c++) bits &= bits - 1; |
45 | bits &= bits - 1; | ||
46 | return c; | 40 | return c; |
47 | } | 41 | } |
48 | 42 | ||
49 | // most significant on-bit - return highest location of on-bit | 43 | // most significant on-bit - return highest location of on-bit |
50 | // NOTE: return 0 when bit0 is on or all bits are off | 44 | // NOTE: return 0 when bit0 is on or all bits are off |
51 | uint8_t biton(uint8_t bits) | 45 | uint8_t biton(uint8_t bits) { |
52 | { | ||
53 | uint8_t n = 0; | 46 | uint8_t n = 0; |
54 | if (bits >> 4) { bits >>= 4; n += 4;} | 47 | if (bits >> 4) { |
55 | if (bits >> 2) { bits >>= 2; n += 2;} | 48 | bits >>= 4; |
56 | if (bits >> 1) { bits >>= 1; n += 1;} | 49 | n += 4; |
50 | } | ||
51 | if (bits >> 2) { | ||
52 | bits >>= 2; | ||
53 | n += 2; | ||
54 | } | ||
55 | if (bits >> 1) { | ||
56 | bits >>= 1; | ||
57 | n += 1; | ||
58 | } | ||
57 | return n; | 59 | return n; |
58 | } | 60 | } |
59 | 61 | ||
60 | uint8_t biton16(uint16_t bits) | 62 | uint8_t biton16(uint16_t bits) { |
61 | { | ||
62 | uint8_t n = 0; | 63 | uint8_t n = 0; |
63 | if (bits >> 8) { bits >>= 8; n += 8;} | 64 | if (bits >> 8) { |
64 | if (bits >> 4) { bits >>= 4; n += 4;} | 65 | bits >>= 8; |
65 | if (bits >> 2) { bits >>= 2; n += 2;} | 66 | n += 8; |
66 | if (bits >> 1) { bits >>= 1; n += 1;} | 67 | } |
68 | if (bits >> 4) { | ||
69 | bits >>= 4; | ||
70 | n += 4; | ||
71 | } | ||
72 | if (bits >> 2) { | ||
73 | bits >>= 2; | ||
74 | n += 2; | ||
75 | } | ||
76 | if (bits >> 1) { | ||
77 | bits >>= 1; | ||
78 | n += 1; | ||
79 | } | ||
67 | return n; | 80 | return n; |
68 | } | 81 | } |
69 | 82 | ||
70 | uint8_t biton32(uint32_t bits) | 83 | uint8_t biton32(uint32_t bits) { |
71 | { | ||
72 | uint8_t n = 0; | 84 | uint8_t n = 0; |
73 | if (bits >>16) { bits >>=16; n +=16;} | 85 | if (bits >> 16) { |
74 | if (bits >> 8) { bits >>= 8; n += 8;} | 86 | bits >>= 16; |
75 | if (bits >> 4) { bits >>= 4; n += 4;} | 87 | n += 16; |
76 | if (bits >> 2) { bits >>= 2; n += 2;} | 88 | } |
77 | if (bits >> 1) { bits >>= 1; n += 1;} | 89 | if (bits >> 8) { |
90 | bits >>= 8; | ||
91 | n += 8; | ||
92 | } | ||
93 | if (bits >> 4) { | ||
94 | bits >>= 4; | ||
95 | n += 4; | ||
96 | } | ||
97 | if (bits >> 2) { | ||
98 | bits >>= 2; | ||
99 | n += 2; | ||
100 | } | ||
101 | if (bits >> 1) { | ||
102 | bits >>= 1; | ||
103 | n += 1; | ||
104 | } | ||
78 | return n; | 105 | return n; |
79 | } | 106 | } |
80 | 107 | ||
81 | 108 | uint8_t bitrev(uint8_t bits) { | |
82 | 109 | bits = (bits & 0x0f) << 4 | (bits & 0xf0) >> 4; | |
83 | uint8_t bitrev(uint8_t bits) | 110 | bits = (bits & 0b00110011) << 2 | (bits & 0b11001100) >> 2; |
84 | { | 111 | bits = (bits & 0b01010101) << 1 | (bits & 0b10101010) >> 1; |
85 | bits = (bits & 0x0f)<<4 | (bits & 0xf0)>>4; | ||
86 | bits = (bits & 0b00110011)<<2 | (bits & 0b11001100)>>2; | ||
87 | bits = (bits & 0b01010101)<<1 | (bits & 0b10101010)>>1; | ||
88 | return bits; | 112 | return bits; |
89 | } | 113 | } |
90 | 114 | ||
91 | uint16_t bitrev16(uint16_t bits) | 115 | uint16_t bitrev16(uint16_t bits) { |
92 | { | 116 | bits = bitrev(bits & 0x00ff) << 8 | bitrev((bits & 0xff00) >> 8); |
93 | bits = bitrev(bits & 0x00ff)<<8 | bitrev((bits & 0xff00)>>8); | ||
94 | return bits; | 117 | return bits; |
95 | } | 118 | } |
96 | 119 | ||
97 | uint32_t bitrev32(uint32_t bits) | 120 | uint32_t bitrev32(uint32_t bits) { |
98 | { | 121 | bits = (uint32_t)bitrev16(bits & 0x0000ffff) << 16 | bitrev16((bits & 0xffff0000) >> 16); |
99 | bits = (uint32_t)bitrev16(bits & 0x0000ffff)<<16 | bitrev16((bits & 0xffff0000)>>16); | ||
100 | return bits; | 122 | return bits; |
101 | } | 123 | } |