我正在使用有限的内存并需要快速访问数组char [80] [10]中的单个位,这实际上为我提供了一个80x80阵列,每个索引只是一个位。
这就是我目前设置,清除和检查各个位的方式:
s[(row)][(col) >> 3] |= (0x80 >> ((col) & 0x07)); //set bit at s[row][col]
s[(row)][(col) >> 3] &= ~(0x80 >> ((col) & 0x07)); //clear bit at s[row][col]
int bit = (s[row][(col) >> 3] & (0x80 >> ((col) & 0x07)) ? 1 : 0); // read bit at s[row][col] into int bit
是否有一些简化使这些表现更快?
谢谢!
答案 0 :(得分:3)
s[row][col] |= (1 << bit); // set bit
s[row][col] &= ~(1 << bit); // clear bit
(s[row][col] & (1 << bit))!=0 // read bit
就C而言,这是最快的。进一步优化将依赖于特定于系统的事情,并且必须由编译器完成。
答案 1 :(得分:0)
作为单一操作,你无法做得更好。但是在更大的算法中,您可以通过使用一致性来分解部分寻址。
也就是说,对于二维阵列[M] [N],访问元素[i] [j]与访问等效的一维阵列的[i * N + j]相同。这是一个乘法,如果它变化较少,可以从内循环中考虑。