免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2665 | 回复: 8
打印 上一主题 下一主题

大家帮我看一下,我写的按位反转,为什么不对 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-28 23:03 |只看该作者 |倒序浏览
本帖最后由 16887126 于 2010-04-29 16:41 编辑

例如: 0000 0011 -------> 1100 0000

unsigned char invert_bit(unsigned char c)
{
    unsigned char t = 0;
    for(int i = 0;i < 8;i++)
    {   
        t |= ( ((7-i)>>c) & (1<<i) );   
    }   

    return t;
}

哪里写错了啊
----------------------------
unsigned char reverse5( unsigned char c)
{
        static unsigned char table[16] =
        {
                0x00,0x08,0x04,0x0C,0x02,0x0A,0x06,0x0E,0x01,0x09,0x05,0x0D,0x03,0x0B,0x07,0x0F
        };
        unsigned char r = 0;

        r |= (table[c&0xF]) << 4;
        r |= table[c>>4];      
        
        return r;
}

//

论坛徽章:
0
2 [报告]
发表于 2010-04-29 00:13 |只看该作者
这个是按位反转吗?需要这么复杂吗

论坛徽章:
0
3 [报告]
发表于 2010-04-29 06:23 |只看该作者
一个 "~" 操作符不就行了么?为什么搞这么复杂?

论坛徽章:
0
4 [报告]
发表于 2010-04-29 09:52 |只看该作者
一个 "~" 操作符不就行了么?为什么搞这么复杂?

lz要的不是'~',而是左右对称的反转;

哪里写错了啊


你自己调试一下;
        t |= ( ((7-i)>>c) & (1<<i) );    应该为         t |= ( ((7-i)>>c) & 1)<<i;

论坛徽章:
0
5 [报告]
发表于 2010-04-29 10:47 |只看该作者
没看仔细,原来是单字节的endian swap

论坛徽章:
0
6 [报告]
发表于 2010-04-29 11:08 |只看该作者

论坛徽章:
0
7 [报告]
发表于 2010-04-29 16:36 |只看该作者
查表吧,比较快

论坛徽章:
0
8 [报告]
发表于 2010-04-30 01:14 |只看该作者
同意楼上的,这种事还是查表快,反正才256种可能性。

论坛徽章:
0
9 [报告]
发表于 2010-04-30 13:21 |只看该作者

  1. /********************************************************************
  2. 将单字节数据反序处理: 0B01001101 -> 0B10110010
  3. perl

  4. foreach $i (0..255)
  5. {
  6.     $r = 0;
  7.     foreach $j (0 .. 7 )
  8.     {
  9.         if (($i & ( 1<< $j)) != 0)
  10.         {
  11.             $r |= (1 << (7 - $j));
  12.         }
  13.     }
  14.     print $r, ", ";
  15.     if (($i & 7) == 7)
  16.     {
  17.         print "\n";
  18.     }
  19. }

  20. http://graphics.stanford.edu/~seander/bithacks.html

  21. static const unsigned char reversed_byte[256] =
  22. {
  23. #   define R2(n)     n,     n + 2*64,     n + 1*64,     n + 3*64
  24. #   define R4(n) R2(n), R2(n + 2*16), R2(n + 1*16), R2(n + 3*16)
  25. #   define R6(n) R4(n), R4(n + 2*4 ), R4(n + 1*4 ), R4(n + 3*4 )
  26.     R6(0), R6(2), R6(1), R6(3)
  27. };
  28. *******************************************************************/
  29. static const unsigned char reversed_byte[256] =
  30. {
  31.     0,  128, 64, 192, 32, 160, 96,  224,
  32.     16, 144, 80, 208, 48, 176, 112, 240,
  33.     8,  136, 72, 200, 40, 168, 104, 232,
  34.     24, 152, 88, 216, 56, 184, 120, 248,
  35.     4,  132, 68, 196, 36, 164, 100, 228,
  36.     20, 148, 84, 212, 52, 180, 116, 244,
  37.     12, 140, 76, 204, 44, 172, 108, 236,
  38.     28, 156, 92, 220, 60, 188, 124, 252,
  39.     2,  130, 66, 194, 34, 162, 98,  226,
  40.     18, 146, 82, 210, 50, 178, 114, 242,
  41.     10, 138, 74, 202, 42, 170, 106, 234,
  42.     26, 154, 90, 218, 58, 186, 122, 250,
  43.     6,  134, 70, 198, 38, 166, 102, 230,
  44.     22, 150, 86, 214, 54, 182, 118, 246,
  45.     14, 142, 78, 206, 46, 174, 110, 238,
  46.     30, 158, 94, 222, 62, 190, 126, 254,
  47.     1,  129, 65, 193, 33, 161, 97,  225,
  48.     17, 145, 81, 209, 49, 177, 113, 241,
  49.     9,  137, 73, 201, 41, 169, 105, 233,
  50.     25, 153, 89, 217, 57, 185, 121, 249,
  51.     5,  133, 69, 197, 37, 165, 101, 229,
  52.     21, 149, 85, 213, 53, 181, 117, 245,
  53.     13, 141, 77, 205, 45, 173, 109, 237,
  54.     29, 157, 93, 221, 61, 189, 125, 253,
  55.     3,  131, 67, 195, 35, 163, 99,  227,
  56.     19, 147, 83, 211, 51, 179, 115, 243,
  57.     11, 139, 75, 203, 43, 171, 107, 235,
  58.     27, 155, 91, 219, 59, 187, 123, 251,
  59.     7,  135, 71, 199, 39, 167, 103, 231,
  60.     23, 151, 87, 215, 55, 183, 119, 247,
  61.     15, 143, 79, 207, 47, 175, 111, 239,
  62.     31, 159, 95, 223, 63, 191, 127, 255
  63. };

  64. //计算某HASH值的反向值
  65. static unsigned int reverse(unsigned int key)
  66. {
  67.     return ((reversed_byte[key & 0xff] << 24) |
  68.         (reversed_byte[(key >> 8) & 0xff] << 16) |
  69.         (reversed_byte[(key >> 16) & 0xff] << 8) |
  70.         (reversed_byte[(key >> 24) & 0xff]));
  71. }
复制代码
上面是一个hash表实现里代码,

位操作技巧:
http://graphics.stanford.edu/~seander/bithacks.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP