对一个字符按bit位逆序(又称反转)
来源:互联网 发布:淘宝店违规描述不符 编辑:程序博客网 时间:2024/04/30 20:31
题目要求如题所示:
将一个字符按bit位逆序,例如一个字节是0x11,将其逆序后就变成0x88。
下面是四种解法,其中最后一种效率最高,是从《Hacker's Delight》这本书中学来的。
第一种:看似创新,其实最笨的做法。使用bit类型,代码不够简洁,执行效率较低,并且扩展不易(例如对int型进行逆序时)。
第二种:传统思路下的做法。代码不是特别简洁,执行效率也不如下面两个高效。
第三种:灵活变化,思路不错。新数或之后左移,原数右移。代码简洁度与执行效率都有提升。
第四种:代码简洁度与执行效率最高的代码。
将一个字符按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;
}
(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;
}
...{
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;
}
...{
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;
}
...{
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 附
对于第四种方法,应该更进一步:用宏定义来实现。
这样效率更高了 ^_^
- 对一个字符按bit位逆序(又称反转)
- 对一个整数按位反转和对字符反转
- 对一个整数按位反转
- 对一个整数按位反转
- 位逆序(位反转)问题
- 反转整数bit位
- 按位反转字符问题
- 按位反转字符问题
- 按位反转字符问题
- 按位反转字符问题
- 将一个无符号整数的bit位逆序
- HDU 4911 Inversion(逆序对-BIT)
- 字符串反转 和 字符逆序
- 按位反转无符号字符
- 按位反转无符号字符
- POJ 2893 M × N Puzzle(逆序对-BIT)
- HDU 3743 Frosh Week(逆序对-BIT)
- HDU 2689 Sort it(逆序对-BIT)
- nPack v1.1.800.2008 Beta
- 你是领导者还是管理者
- [诗歌][春节感想]在京已七年
- 如何在 SQL Server 2005 中为安装程序增加计数器注册表项值
- 《TCL/TK编程实践》第四版 第23章 TK基本原理
- 对一个字符按bit位逆序(又称反转)
- 新鲜出炉: IE8 beta1 的下载地址以及官方论坛
- GridView的应用
- 08年3月5号
- 读书摘要:C++ Template:The Complete Guide
- 英语背诵文
- 單元測試
- 测试用例审查
- 测试文档系列--测试报告