对一个字符按bit位逆序(又称反转)

题目要求如题所示:
将一个字符按bit位逆序,例如一个字节是0x11,将其逆序后就变成0x88。
下面是四种解法,其中最后一种效率最高,是从《Hacker's Delight》这本书中学来的。

第一种: 看似创新,其实最笨的做法。使用bit类型,代码不够简洁,执行效率较低,并且扩展不易(例如对int型进行逆序时)。
#define  exchange(x,y) { (x) ^= (y);  /
                                       (y) 
^=  (x);  /
                                       (x) 
^=  (y);  /
                                     }

unsigned 
char  fun1(unsigned  char  c)
{
        
int i;
        union 
{
                unsigned 
char c;
                
struct {
                        unsigned 
char bit0:1;
                        unsigned 
char bit1:1;
                        unsigned 
char bit2:1;
                        unsigned 
char bit3:1;
                        unsigned 
char bit4:1;
                        unsigned 
char bit5:1;
                        unsigned 
char bit6:1;
                        unsigned 
char bit7:1;
                }
 bchar;
        }
 ubc;
        ubc.c 
= c;
        exchange(ubc.bchar.bit0, ubc.bchar.bit7);
        exchange(ubc.bchar.bit1, ubc.bchar.bit6);
        exchange(ubc.bchar.bit2, ubc.bchar.bit5);
        exchange(ubc.bchar.bit3, ubc.bchar.bit4);

        
return ubc.c;
}


第二种: 传统思路下的做法。代码不是特别简洁,执行效率也不如下面两个高效。
unsigned  char  fun2(unsigned  char  c)
{
        
int i = 7;
        unsigned 
char tmp = 0x01;
        unsigned 
char newc = 0x00;

        
for ( ; i > 3; i--{
                newc 
|= ((c & tmp) << (i - (8 - i -1)));
                tmp 
<<= 1;
        }

        
for ( ; i >=0; i--{
                newc 
|= ((c & tmp) >> ((8 - i -1- i));
                tmp 
<<= 1;
        }


        
return newc;
}


第三种:灵活变化,思路不错。新数或之后左移,原数右移。代码简洁度与执行效率都有提升。
unsigned  char  fun3(unsigned  char  c)
{
        
int i;
        unsigned 
char newc = 0x00;

        
for (i = 0; i < 7; i++{
                newc 
|= (c & 1);
                newc 
<<= 1;
                c 
>>= 1;
        }


        
return newc;
}


第四种:代码简洁度与执行效率最高的代码。
unsigned  char  fun4(unsigned  char  c)
{
        c 
= (c & 0xaa>> 1 | (c & 0x55<< 1;
        c 
= (c & 0xcc>> 2 | (c & 0x33<< 2;
        c 
= (c & 0xf0>> 4 | (c & 0x0f<< 4;

        
return c;
}

 

 

2008-12-10 附

对于第四种方法,应该更进一步:用宏定义来实现。

这样效率更高了 ^_^

  • 0
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值