如何高效将数组索引映射为指定数值?C++优化实现问询
最优C++实现方案:根据索引i计算a、b值
首先明确索引i(0-7)与a、b的对应关系:
| i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| a | -1 | 1 | -2 | 2 | 1 | -1 | 2 | -2 |
| b | 2 | 2 | 1 | 1 | -2 | -2 | -1 | -1 |
以下是几种优化实现方式,按可读性和效率优先级排序:
1. 直接查表法(推荐首选)
对于固定小范围的输入(i仅0-7),查表法是最直观、高效且易维护的方案,无计算开销,直接通过索引取值:
// 预先定义对应关系表 const int a_table[] = {-1, 1, -2, 2, 1, -1, 2, -2}; const int b_table[] = {2, 2, 1, 1, -2, -2, -1, -1}; // 计算a和b int a = a_table[i]; int b = b_table[i];
后续若需修改a、b的对应值,仅需调整数组内容即可,完全不需要修改逻辑代码。
2. 位运算简化实现
通过分析i的二进制特征(0-7对应3位二进制:bit2 bit1 bit0),提炼规律后用位运算实现,无额外内存开销,计算效率高:
// 位运算实现,无内存开销 int a = ( (( (i >> 2) ^ (i & 1) ) ? 1 : -1) * (1 + ((i >> 1) & 1)) ); int b = ( (i >> 2) ? -1 : 1 ) * (2 - ((i >> 1) & 1));
规律说明:
- a的计算:
- 绝对值:
bit1为0时是1,为1时是2(通过1 + ((i >>1)&1)实现); - 符号:
bit2与bit0相同时为负,不同时为正(通过(i>>2)^(i&1)判断)。
- 绝对值:
- b的计算:
- 绝对值:
bit1为0时是2,为1时是1(通过2 - ((i>>1)&1)实现); - 符号:
bit2为0时为正,为1时为负(通过i>>2判断)。
- 绝对值:
3. 简化条件表达式
若偏好条件表达式风格,可将原复杂逻辑简化为更易读的版本:
// 简化条件表达式,可读性优于原代码 int a = ( ((i >= 4) ^ (i % 2)) ? 1 : -1 ) * ( (i & 2) ? 2 : 1 ); int b = (i >= 4 ? -1 : 1) * ( (i & 2) ? 1 : 2 );
逻辑说明:
- a的计算:
- 用
i&2判断bit1,决定绝对值是1还是2; - 用
(i>=4)^(i%2)判断符号,相同为负,不同为正。
- 用
- b的计算:
- 用
i>=4判断符号; - 用
i&2判断绝对值是2还是1。
- 用
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

