十进制转二进制

查看《程序员面试宝典》中,一段代码如下:

#include <iostream>
using namespace std;
int func(int x)
{
 int count=0;
 while(x)
 {
  count ++;
  x=x&(x-1);
 }
 return count;
}
int main()
{
 cout<<func(9999)<<endl;
 return 0;
}
要计算输出结果是多少,把C++都还给老师的我看了半天不知道在描述什么,看了答案才知道这道题的精妙之处:通过x=x&(x-1); 来计算整数x转换成二进制数后1的个数。被刺激后的我决定要自己重拾C++,然后就开始研究任意整数输出转换为二进制数输出的程序应该怎么写,用笔算很简单,除以2,然后看余数:
10/2=5;10%2=0;
5/2=2 ;5%2=1;
2/2=1 ;
10=(110).
根据这个转换公式,可以知道十进制转换二进制需要用这个数除以2,看余数。以为这个挺简单,但是代码实现起来就犯难--难道用不停的循环?我能想到的也只有循环语句了。但是循环我能想到的是双层循环,还挺麻烦,百般犹豫下决定百度一下代码,看到一段代码后才豁然开朗:原来可以这样,这么简单;
void Dec2Bin( int i)
{
 if(i/2)
   Dec2Bin(i/2);
 cout<<(i%2);
}
利用函数可以调用自己进行迭代运算,就能算出值来。
做完这个之后,就能输入十进制,输出二进制数了。但是问题来了,这只能输入正整数,负整数就不行,我于是又想怎么解决,都想到了判断负数的话让最大的数加上负数了,后来一拍脑袋——用强制类型转换,数据存储的格式是不变的,只是取数据有不同,这样把负数当成正整数来取就可以了
于是:
void Dec2Bin( unsinged int i)
{
 if(i/2)
   Dec2Bin(i/2);
 cout<<(i%2);
}
只需要加一个unsigned,不需要条件语句判断正负。
完成以后,又觉得把Dec2Bin这个程序跟main放在一起不方便了,于是把它拆开,使用头函数,在这里又遇到一个问题:宏要大写!
#ifndef TOBINARY_H //此处需要大写
#define TOBINARY_H
完成之后,Dec2Bin和main函数就可以拆开了。
做完这些之后,对整数在内存中的存储理解更深一层了。
后来又查到了一个C++自带的库:bitset,
cout << bitset ::digits>(123) << endl;
// 还可以把二进制字符串转换为整数
cout << bitset<100>(string("100010110")).to_ulong() << endl; 可以直接使用,将整数转换为二进制。
又收集了几种不同算法的代码:
 for(int i = 16; i > 0; i--)
 {
  if(val & (1 << i))//此处为将1左移i位,并且与val相与,如果val对应位为1,则输出1,否则输出0
   cout << "1";
  else
   cout << "0";
 }
将16(1000)左移位,与val相与进行判断。
posted @ 2015-06-25 20:51  小精灵儿Pawn  Views(393)  Comments(0Edit  收藏  举报

如果您觉得此文有帮助,可以打赏点钱给我支付宝。 谢谢 -):