这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 青岛朗讯的一道题,可惜我没有去

共2条 1/1 1 跳转至

青岛朗讯的一道题,可惜我没有去

院士
2006-09-17 18:14:16     打赏
青岛朗讯的一道题,可惜我没有去



关键词: 青岛     朗讯     一道     可惜     没有    

院士
2006-12-22 22:43:00     打赏
2楼
问 大意是说将一个整数反置,如二进制是01010000 ,结果为00001010
我想可以这样
unsigned int getit(unsigned int v)
{
unsigned int result = 0,t = ((unsigned int)(~0)>>1)+1;
while(v!=0)
{
   if(v&1!=0)
   {
     result|=t;
    }
   t>>=1;
   v>>=1;
  }
return( result);
}
不知道大家有什么好的实现,
     1: 如果用汇编除移动数据外,只需要一条指令。
2: 对啊,为什么不用汇编呢 3: 呵呵传说中的CPL语句?:) 4: 看看这样行吗?unsigned char getit(unsigned char v)
{
unsigned char result = 0,i;
for(i=0;i<8;i++)
    {
    result<<=1;
    result+=v%2;
    v>>=1;
  }
return( result);
}


5: 可以阿  误会了,我举例是8位,可是整数不一定是8位阿
awey 写的有个好处是不需要判断语句,但出现了MOD运算,这样效率可能依赖
不同的编译器。

  6: 不用判断语句,大概可以这样吧unsigned int getit(unsigned int v)
{
unsigned int result = 0,t = (unsigned int)(~0);
while(v!=0)
{   
   t>>=1;
   result|= v&1 + t;
   v>>=1;
}

result &=~t;
return( result);

}
7: 不错 8: 模2运算在编译器里好像就是移位运算 9: 厉害 10: 右移出,左移入 11: 其实用判断语句效率不见得低既不能固定位数,又不用判断语句,大概只能这样了(不如判断语句清楚):

unsigned int InvertBitOrder(unsigned int v)
{
    static const unsigned int mask[] = { 0u, ~0u };
    unsigned int result = 0u;
    unsigned int bit = ((~0u)>>1)+1;
    while(v != 0)
    {
        result |= ( bit & mask[v & 0x01] );
        bit >>= 1;
        v >>= 1;
    }
}
12: 去MCU厂家定做一条这样反转的指令,呵呵~~~~~~~~~~

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]