user-0 提问: 位运算对称的算法是什么

回复:
user: user-0
content: 引用 31 楼 DelphiGuy 的回复:你还能再搞笑一些么？ http://graphics.stanford.edu/~seander/bithacks.html?1=1#BitReverseObvious Reverse the bits in a byte with 3 operations (64-bit multiply and modulus division):  unsigned char b; // reverse this (8-bit) byte   b = (b * 0x0202020202ULL & 0x010884422010ULL) % 1023;  哦，没仔细看，8位的话不知道这种方法有什么意义

user: user-0
content: 引用 32 楼 zhao4zhong1 的回复:仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> int v; int bitrev1(const int b) {     register int n;      n=b;     n=((n>> 1)&0x55555555)|((n<< 1)&0xaaaaaaaa);     n=((n>> 2)&0x33333333)|((n<< 2)&0xcccccccc);     n=((n>> 4)&0x0f0f0f0f)|((n<< 4)&0xf0f0f0f0);     n=((n>> 8)&0x00ff00ff)|((n<< 8)&0xff00ff00);     n=((n>>16)&0x0000ffff)|((n<<16)&0xffff0000);     return n; } int bitrev2(const int b) {     __asm {         push ebx         push ecx         mov ebx,b         mov ecx,32     nextbit:         rcl ebx,1         rcr eax,1         loop nextbit         pop ecx         pop ebx     } } int bitrev3(const int b) {     char bs[33],bs1[33],*ep;      itoa(b,bs1,2);     sprintf(bs,"%032s",bs1);     strrev(bs);     return strtol(bs,&ep,2); } void main() {     v=0x12345678;//0001 0010 0011 0100 0101 0110 0111 1000     printf("%08x\n",bitrev1(v));     printf("%08x\n",bitrev2(v));     printf("%08x\n",bitrev3(v)); } //1e6a2c48 //1e6a2c48 //1e6a2c48   肯定用第一种，你再看看这个，http://bbs.csdn.net/topics/391994422

user: user-1
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> int v; int bitrev1(const int b) {     register int n;      n=b;     n=((n>> 1)&0x55555555)|((n<< 1)&0xaaaaaaaa);     n=((n>> 2)&0x33333333)|((n<< 2)&0xcccccccc);     n=((n>> 4)&0x0f0f0f0f)|((n<< 4)&0xf0f0f0f0);     n=((n>> 8)&0x00ff00ff)|((n<< 8)&0xff00ff00);     n=((n>>16)&0x0000ffff)|((n<<16)&0xffff0000);     return n; } int bitrev2(const int b) {     __asm {         push ebx         push ecx         mov ebx,b         mov ecx,32     nextbit:         rcl ebx,1         rcr eax,1         loop nextbit         pop ecx         pop ebx     } } int bitrev3(const int b) {     char bs[33],bs1[33],*ep;      itoa(b,bs1,2);     sprintf(bs,"%032s",bs1);     strrev(bs);     return strtol(bs,&ep,2); } void main() {     v=0x12345678;//0001 0010 0011 0100 0101 0110 0111 1000     printf("%08x\n",bitrev1(v));     printf("%08x\n",bitrev2(v));     printf("%08x\n",bitrev3(v)); } //1e6a2c48 //1e6a2c48 //1e6a2c48

user: user-2
content: 引用 30 楼 java_charpnet 的回复:[quote=引用 29 楼 DelphiGuy 的回复:] [quote=引用 25 楼 java_charpnet 的回复:] [quote=引用 24 楼 DelphiGuy 的回复:] 这是实现字节位逆序最快的算法，你好好领会吧。  这种有什么好领会的，毫无技术含量，最快的是这个，64位，b = (b * 0x0202020202ULL & 0x010884422010ULL) % 1023;[/quote]  你这么说太棒槌了，这个算法需要mul、div、and，除法多慢你不懂啊，慢得没边了，应该都没有查表法1/5的性能。 另外，它这个"64位"是说用到了64位运算，不是能求64位数逆序，结果还是8位的。 [/quote]  不是64位是什么，还8位，真是搞笑了，查表能查到几位，内存放的下[/quote]  你还能再搞笑一些么？ http://graphics.stanford.edu/~seander/bithacks.html?1=1#BitReverseObvious Reverse the bits in a byte with 3 operations (64-bit multiply and modulus division):  unsigned char b; // reverse this (8-bit) byte   b = (b * 0x0202020202ULL & 0x010884422010ULL) % 1023;

user: user-0
content: 引用 29 楼 DelphiGuy 的回复:[quote=引用 25 楼 java_charpnet 的回复:] [quote=引用 24 楼 DelphiGuy 的回复:] 这是实现字节位逆序最快的算法，你好好领会吧。  这种有什么好领会的，毫无技术含量，最快的是这个，64位，b = (b * 0x0202020202ULL & 0x010884422010ULL) % 1023;[/quote]  你这么说太棒槌了，这个算法需要mul、div、and，除法多慢你不懂啊，慢得没边了，应该都没有查表法1/5的性能。 另外，它这个"64位"是说用到了64位运算，不是能求64位数逆序，结果还是8位的。 [/quote]  不是64位是什么，还8位，真是搞笑了，查表能查到几位，内存放的下

user: user-2
content: 引用 25 楼 java_charpnet 的回复:[quote=引用 24 楼 DelphiGuy 的回复:] 这是实现字节位逆序最快的算法，你好好领会吧。  这种有什么好领会的，毫无技术含量，最快的是这个，64位，b = (b * 0x0202020202ULL & 0x010884422010ULL) % 1023;[/quote]  你这么说太棒槌了，这个算法需要mul、div、and，除法多慢你不懂啊，慢得没边了，应该都没有查表法1/5的性能。 另外，它这个"64位"是说用到了64位运算，不是能求64位数逆序，结果还是8位的。

user: user-3
content: 搞java的研究性能干嘛，写个 for一行的事情，不用看明白咋搞的

user: user-3
content: solve<8>   和 solve<7> 又不是同一个函数, 递归你个毛啊...

user: user-0
content: 引用 23 楼 user-3 的回复:不懂的不要乱说,  自己看书去,  这不是递归,  这只是为了自动的循环展开.    这样写会自动将  slovle_N( )  展开为连续的 N 次位操作  ..  这个标准做法就是大量的  bitroder swap 像 DelphiGuy 一样查表,  少量的操作就老实的循环.  这不是递归是什么，编译器会自动优化啊

user: user-3
content: 弱智啊,  %1023  的结果只有 0-1022 怎么可能是 64位的...

user: user-0
content: 引用 24 楼 DelphiGuy 的回复:这是实现字节位逆序最快的算法，你好好领会吧。  这种有什么好领会的，毫无技术含量，最快的是这个，64位，b = (b * 0x0202020202ULL & 0x010884422010ULL) % 1023;

user: user-2
content: 引用 20 楼 java_charpnet 的回复:[quote=引用 18 楼 DelphiGuy 的回复:] [quote=引用 16 楼 java_charpnet 的回复:] [quote=引用 14 楼 DelphiGuy 的回复:] 如果限定字节数据的话，应该还是查表法快。  什么查表法，怎么闻所未闻，是干什么的[/quote]   就是 typedef unsigned char BYTE;  __inline BYTE Reverse(BYTE x) {   static const BYTE r[256] = {0x00, 0x80, 0x40, 0x20, 0x10， ... , x0ff};  // 这里你自己补全    return r[x]; } [/quote]  原来是这样，这种就更胡扯了，等于是人工逆序[/quote]  这是实现字节位逆序最快的算法，你好好领会吧。

user: user-3
content: 不懂的不要乱说,  自己看书去,  这不是递归,  这只是为了自动的循环展开.    这样写会自动将  slovle_N( )  展开为连续的 N 次位操作  ..  这个标准做法就是大量的  bitroder swap 像 DelphiGuy 一样查表,  少量的操作就老实的循环.

user: user-0
content: 引用 21 楼 user-3 的回复:没听过你关心性能干嘛,  一个用java的跑 C 这来教人写高性能程序也太搞了吧...  谁关心性能了，我是把循环改成位运算，搞了半天说用递归

user: user-3
content: 没听过你关心性能干嘛,  一个用java的跑 C 这来教人写高性能程序也太搞了吧...

user: user-0
content: 引用 18 楼 DelphiGuy 的回复:[quote=引用 16 楼 java_charpnet 的回复:] [quote=引用 14 楼 DelphiGuy 的回复:] 如果限定字节数据的话，应该还是查表法快。  什么查表法，怎么闻所未闻，是干什么的[/quote]   就是 typedef unsigned char BYTE;  __inline BYTE Reverse(BYTE x) {   static const BYTE r[256] = {0x00, 0x80, 0x40, 0x20, 0x10， ... , x0ff};  // 这里你自己补全    return r[x]; } [/quote]  原来是这样，这种就更胡扯了，等于是人工逆序

user: user-0
content: 引用 17 楼 user-3 的回复:[quote=引用 15 楼 java_charpnet 的回复:] [quote=引用 13 楼 user-3 的回复:] 搞java的研究性能干嘛，写个 for一行的事情，不用看明白咋搞的  仔细看了看，你这都递归了，效率太差还不如循环[/quote]  不懂的不要乱发言,  尾递归就是循环, 何况这还不是尾递归.. [/quote]  你懂在什么地方，32位五行语句64位一行语句的事情，又是模板又是cache的，还什么尾递归，闻所未闻

user: user-2
content: 引用 16 楼 java_charpnet 的回复:[quote=引用 14 楼 DelphiGuy 的回复:] 如果限定字节数据的话，应该还是查表法快。  什么查表法，怎么闻所未闻，是干什么的[/quote]   就是 typedef unsigned char BYTE;  __inline BYTE Reverse(BYTE x) {   static const BYTE r[256] = {0x00, 0x80, 0x40, 0x20, 0x10， ... , x0ff};  // 这里你自己补全    return r[x]; }

user: user-3
content: 引用 15 楼 java_charpnet 的回复:[quote=引用 13 楼 user-3 的回复:] 搞java的研究性能干嘛，写个 for一行的事情，不用看明白咋搞的  仔细看了看，你这都递归了，效率太差还不如循环[/quote]  不懂的不要乱发言,  尾递归就是循环, 何况这还不是尾递归..

user: user-0
content: 引用 14 楼 DelphiGuy 的回复:如果限定字节数据的话，应该还是查表法快。  什么查表法，怎么闻所未闻，是干什么的