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

The Bloom of Youth

本博客已搬家至http://kuangqi.me

 
 
 

日志

 
 

使用位运算将十进制转化为二进制  

2009-04-29 23:25:08|  分类: 真回收站 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

将十进制转化为二进制(其实不止是二进制,可以转化为任何进制)的常用方法是短除法。这种方法比较适合笔算。但移植到计算机上,却要进行取模,除法等运算,较为低效。由于计算机本身就使用二进制表示数据,故十进制转二进制用位运算是最好的方法。而且,由于位运算直接操作二进制位,效率极高。

void convert(int i)
{
    int s=0;
    for(int j=0;j<n;j++)
    {
        int tmp=((((i>>s)>>1)<<1) ^ (i>>s));
        s++;
        sol[j]=(bool)tmp;
    }
}

以上程序将整数i转换为二进制,逆序存储于布尔数组sol中。变量n为二进制的位数。

其核心语句是:(((i>>s)>>1)<<1) ^ (i>>s))

分步骤解释一下:

1. ((((i>>s)>>1)<<1)

先将i右移s位:目的是将二进制中待转换的那位移到最后一位

左移再右移:目的是丢掉最后一位待转换位。为什么?一会告诉你。

2.异或运算(^)

将丢掉待转换位的和没丢掉待转换位的两数进行异或运算。如果待转换位是1,左移右移时会被丢掉。故异或运算返回1.如果待转换位为0,左右移后就没有变化,所以异或后为零。

如果还是不明白,看看例子。我们将5(二进制101)转换为二进制:

1.101>>0=101

2.((101>>)<<1)=100 <----这里丢失了最后一个1

3.100^101=1 <----看到了,最后一位有差别,结果为1。

4.101>>1=10

5.((10>>1)<<1)=10 <----由于最后一位是0,左右移后原数不变

6.10^10=0 <----相同的两数异或,结果为0

7,8,9步跟1,2,3步类似,不再解释。


 

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

历史上的今天

评论

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

页脚

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