Chinaunix首页 | 论坛 | 博客
  • 博客访问: 830159
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-19 13:07:58

unsigned char reverse8( unsigned char c )
{
    c = ( c & 0x55 ) << 1 | ( c & 0xAA ) >> 1;
    c = ( c & 0x33 ) << 2 | ( c & 0xCC ) >> 2;
    c = ( c & 0x0F ) << 4 | ( c & 0xF0 ) >> 4;
    return c;
}

unsigned long func(unsigned long x)
{
    x = (x & 0x55555555UL) + ((x >> 1) & 0x55555555UL);
    x = (x & 0x33333333UL) + ((x >> 2) & 0x33333333UL);
    x = (x & 0x0f0f0f0fUL) + ((x >> 4) & 0x0f0f0f0fUL);
    x = (x & 0x00ff00ffUL) + ((x >> 8) & 0x00ff00ffUL);
    x = (x & 0x0000ffffUL) + ((x >> 16) & 0x0000ffffUL);
    return x;
} 更佳的算法见“HAKMEM算法”

以字节为单位反转
inline DWORD Reverse4( DWORD n )
{
    DWORD m = ((n>>8)&0x00FF00FF) | ((n&0x00FF00FF)<<8);
    return ((m>>16)&0x0000FFFF) | ((m&0x0000FFFF)<<16);
}
汇编 BSWAP 指令
unsigned long _byteswap_ulong( unsigned long val );
uint32_t bswap_32( uint32_t x );
阅读(1367) | 评论(4) | 转发(0) |
0

上一篇:map::rbegin的一个注意点

下一篇:互锁操作

给主人留下些什么吧!~~

网友评论2012-11-19 13:10:19

alberte
感觉很高深,需要时间消化

网友评论2012-11-19 13:10:04

xilihuala
反转是先将字节分为两个半位元,在半位元内进行比特交换(前面两条语句),最后将半位元进行交换

计算1的个数是利用二分的方法,将所有比特递归相加,可以看到,首先是偶数比特和奇数比特相加,如果1的字节在最后两个比特上的话,那么这就足够计算1的个数了,但实际上高位可能存在1,所以将这个过程持续下去,第二次就将相邻两个比特组成一个组,同样将奇数组和偶数组相加,这样下去,所有高位的计数最后就合并到低位计数上了。

这两个算法实际上体现的是二分法的思想

网友评论2012-11-19 13:09:51

maxzero
小弟看不懂,能否介绍下思路?

网友评论2012-11-19 13:09:25

todototry
反转一个字节 和 判断32位整数二进制中1的个数 的算法
todototry引用了该文章,地址:http://blog.csdn.net/todototry/archive/2007/04/23/1575900.aspx