注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

HongMain 的博客

关注编程技术: Linux, Windows, C/C++

 
 
 

日志

 
 
 
 

逆转一个整数的二进制表示问题  

2011-10-29 12:18:03|  分类: 算法 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

#include <stdio.h>

#define GetBitsLength(a) (sizeof(a) * 8)

/* Display the value as binary */
void DisplayAsBinary(unsigned int value)
{
int i = 0;
for (; i < GetBitsLength(value); i++)
{
        putchar(value & 1 ? '1' : '0');
        value >>= 1;
}
}

/* 解法1
相当于把二进制串旋转一个串长度 */
unsigned int BitReverse1(unsigned int n)
{
unsigned int ret = 0;
int i = 0;
for(; i < GetBitsLength(n); i++)
{
ret = (ret << 1) | (n & 1);
        n >>= 1;
}
return ret;
}

/* 解法2
当旋转一个串时,可以把串看成有两段组成的,记位XY。旋转相当于要把字符串XY变成YX。

   我们首先对X和Y两段分别进行翻转操作,这样就能得到XTYT。接着再对XTYT进行翻转操作,

   得到(XTYT)T=(YT)T(XT)T=YX。正好是我们期待的结果。 */
unsigned int BitReverse2(unsigned int n)
{
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 main()
{
int test[] = {0x1, 0xf, 0xf0f0f, 0x1234abcd, 0xabcd1234};

int i;
int rval;
for (i = 0; i < sizeof(test)/sizeof(int); i++)
{
        rval = BitReverse2(test[i]);

        DisplayAsBinary(test[i]);
        putchar('\t');
        DisplayAsBinary(rval);
        putchar('\n');

}
}

  评论这张
 
阅读(35)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017