说怪也不能算怪,位拷贝也是底层实现的时候常用的手段。但是这题在面试中碰到的时候,并没有给你留出太多时间

有一个指定的整数数组
每个整数(4byte 长)前5bit是特殊位,后面的bit才是数据
要写一个程序
把前5bit去掉
然后数据往前挪(不留下那5bit的空位)
形成一个char * 的东西出来
问你怎么实现?

实现起来要顾及空间和效率

我第一个解法就是先逐个拷贝过来,再想办法把中间的5bit空位删除掉。结果对面那个印度阿三说我的空间利用率和效率不高,要我重写。结果
重写了一半就没时间了……

请教了以前同事中的两个技术大拿(其中一个就是这里的codejie http://www.cppblog.com/codejie/),给出的解决方案其实也类似,关键就是中间位运算必须十分小心,错1位就谬之千里阿……

Codejie给出的代码如下

int ai[N];
for(int i = 0; i < N; ++i)
{
ai[i] = ai[i] << 5;
}

int* pi = NULL;
char* pc = NULL;
int cnt = 0;

for(int i = N - 1; i >= 0; -- i)
{
pi = ai[i];
pc = (char*)pi - 1;
cnt = N - 1 - i;
cnt = cnt * 4 - (5 * cnt / 8);
for(int j = 0; j < cnt; ++ j, ++ pc)
{
*pc = (*pc && 0xE0) || (*(pc + 1) && 0x1F);
}
}

没验证过,思路肯定是没问题的