Advent Of Code字符优先级计算:寻求更简洁的纯C实现方案
优化Advent Of Code字母优先级映射的纯C实现技巧
我在做Advent Of Code的趣味谜题,需要将小写字母a-z映射为优先级1-26,大写字母A-Z映射为27-52。目前已经实现了两种写法,但希望找到更简洁、高效且优雅的纯C实现方式。
现有实现方式
1. 数组查表法
static uint8_t map[] = { ['a'] = 1, ['b'] = 2, ['c'] = 3, ['d'] = 4, ['e'] = 5, ['f'] = 6, ['g'] = 7, ['h'] = 8, ['i'] = 9, ['j'] = 10, ['k'] = 11, ['l'] = 12, ['m'] = 13, ['n'] = 14, ['o'] = 15, ['p'] = 16, ['q'] = 17, ['r'] = 18, ['s'] = 19, ['t'] = 20, ['u'] = 21, ['v'] = 22, ['w'] = 23, ['x'] = 24, ['y'] = 25, ['z'] = 26, ['A'] = 27, ['B'] = 28, ['C'] = 29, ['D'] = 30, ['E'] = 31, ['F'] = 32, ['G'] = 33, ['H'] = 34, ['I'] = 35, ['J'] = 36, ['K'] = 37, ['L'] = 38, ['M'] = 39, ['N'] = 40, ['O'] = 41, ['P'] = 42, ['Q'] = 43, ['R'] = 44, ['S'] = 45, ['T'] = 46, ['U'] = 47, ['V'] = 48, ['W'] = 49, ['X'] = 50, ['Y'] = 51, ['Z'] = 52 };
2. ASCII偏移计算法
#define UPRMAGIC 0x26 #define LWRMAGIC 0x60 // 调用示例 return islower(c) ? c - LWRMAGIC : c - UPRMAGIC;
更简洁高效的实现技巧
1. 直观化ASCII偏移计算
用字符常量代替魔法值,可读性大幅提升,效率与原偏移法一致:
int get_priority(int c) { return islower(c) ? c - 'a' + 1 : c - 'A' + 27; }
2. 无分支位运算优化(输入为合法字母时适用)
利用ASCII大小写字母的第5位差异(小写为1,大写为0)消除条件分支,性能更优:
int get_priority(int c) { // 先统一转大写计算基础1-26值,再根据原字符大小写补差值 return (c & ~0x20) - 'A' + 1 + ((c & 0x20) ? 0 : 26); }
3. 紧凑查表法
缩小查表数组的内存占用,同时保留查表的高效性:
static const uint8_t priority[] = { 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 }; int get_priority(int c) { return priority[islower(c) ? c - 'a' : c - 'A']; }
内容的提问来源于stack exchange,提问作者bjarne
相关产品推荐
相关产品推荐

