#include<bits/stdc++.h>
using namespace std;
int main()
{
int x;
int a[100];
while(cin>>x){
memset(a,0,sizeof a);
int k=0;
while(x!=0){
a[k++]=x%2;
x>>=1;
}
for(int i=k-1;i>=0;i--){
cout<<a[i];
}
cout<<endl;
}
return 0;
}
还有一种是把前面的0都输出,凑够32位的代码
这个也适用于负数
#include<bits/stdc++.h>
using namespace std;
int main()
{
int x;
while(cin>>x){
for(int i=31;i>=0;i--){
cout<<(x>>i&1);//先右移,在与运算
}
cout<<endl;
}
return 0;
}
- 负数转换成二进制
1.将十进制输转化成二进制数,不管符号。
2.对转化的二进制数逐位取反
3.对取反后的二进制数加1,结果就是十进制负数转化成的二进制数。
例:-32转化成二进制数
1.(十进制)32=(二进制)00100000
2.(二进制)00100000逐位取反为:11011111
3.二进制数+1得:11100000
例:-5转化成二进制数
1.(十进制)5=(二进制)00000101
2.(二进制)00100000逐位取反为:11111010
3.二进制数+1得:11111011
- 关于负数转化为二进制可以看这个 负数的二进制表示
- 负数的二进制用补码表示
小数转换为二进制:
正整数 和 正小数 转换为 二进制的代码:
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
int main()
{
float f;
cin>>f;
int x = f;//整数部分
float y = f - x;//小数部分
stack<int> sta;
queue<int> que;//存放小数
while(x) {
sta.push(x%2);
x >>= 1;
}
while(y) {
que.push(int(y*2));
y = (y*2) - int(y*2);
}
if(f < 1)
cout<<"0";
while(!sta.empty()) {
cout<<sta.top();
sta.pop();
}
cout<<".";
while(!que.empty()) {
cout<<que.front();
que.pop();
}
return 0;
}
十进制转换为R进制:
//http://acm.hdu.edu.cn/showproblem.php?pid=2031
#include<stdio.h>
using namespace std;
int main()
{
int n,m,i,x,flag;
int a[1000];
while (scanf("%d %d",&n,&m)!=EOF) {
flag=0;
if (n<0) {
n=-n;
flag=1;
}
x=0;
while (n>0) {//模拟
a[x]=n%m;
n/=m;
x++;
}
while (x--) {
if (flag) {
printf("-");
flag=0;
}
if (a[x]<10)
printf("%d",a[x]);
else
printf("%c",55+a[x]); //int 与 char类型的转换精髓 (大于9的转换成字符)
}
printf("\n");
}
return 0;
}
顺序表实现十进制转二进制:
#include<stdio.h>
#include<iostream>
using namespace std;
#define MAXSIZE 100
struct SqList
{
int *elem;
int length;
};
int InitList(SqList &L)
{ //只有在C++中才会有引用的存在
L.elem = new int[MAXSIZE];
if (!L.elem)
return 0; //内存分配失败,存储空间不够
L.length = 0; //表示顺序表为空
return 1;
}
int ListInsert(SqList &L, int i, int e)
{
if(i<0 || i>L.length+1)
return 0;
if(L.length == MAXSIZE)
return 0;
L.elem[i]=e;
L.length++;
return 1;
}
int GetElem(SqList &L, int i, int &e)
{
if(i<0 || i>L.length)
return 0;
e = L.elem[i];
return 1;
}
int main()
{
int x;
int e;
cout<<"请输入一个数(十进制): ";
cin>>x;
SqList L;
InitList(L);
int cnt = 0;
while(x) {
ListInsert(L, cnt, x%2);
cnt++;
x /= 2;
}
cout<<"转换为二进制后为:\n";
for(int i = cnt-1; i >= 0; i--) {
GetElem(L, i, e);
cout<<e;
}
return 0;
}
借鉴的十进制转r进制
# include <iostream>
# include <string>
# include <algorithm>
# include <map>
# define ll long long
using namespace std;
struct node
{
char ch;
node * nxt;
};
ll x;
int r;
map <int,char> ma;
node *L=new(node);
void init()
{
for(int i=0;i<10;i++)
ma[i]=i+'0';
ma[10]='A';
ma[11]='B';
ma[12]='C';
ma[13]='D';
ma[14]='E';
ma[15]='F';
return ;
}
string solve()
{
node *p;
if(x==0)
return "0";
while(x)
{
p=new(node);
p->ch=ma[x%r];
p->nxt=L->nxt;
L->nxt=p;
x/=r;
}
string a="";
p=L->nxt;
while(p)
{
a+=p->ch;
node *q=p;
p=p->nxt;
free(q);
}
return a;
}
int main()
{
init();
while(cin>>x>>r)
{
L->nxt=NULL;
if(x<0)
{
x=-x;
cout<<"-"<<solve()<<endl;
}
else
cout<<solve()<<endl;
}
}
十进制转二进制-链栈实现
#include <stdio.h>
#include <iostream>
#include <malloc.h>
using namespace std;
struct Node {
int data;
struct Node *nxt;
};
typedef struct Node Stack;
Stack *s;
void init() {
s = NULL;
return ;
}
bool Empty() {
if (s == NULL) {
return true;
}
else {
return false;
}
}
void Push(int element) {
Stack *p = (Stack *)malloc(sizeof(Stack));
p->data = element;
p->nxt = s;
s = p;
}
void Pop() {
s = s->nxt;
}
int Top() {
return s->data;
}
void Destroy() {
free(s);
s = NULL;
}
int main() {
int n;
while(cin>>n) {
init();
if (n < 0) {
cout<<"-";
n *= -1;
}
while (n) {
Push(n & 1);// n%2
n >>= 1;
}
while (!Empty()) {
cout<<Top();
Pop();
}
cout<<endl;
}
return 0;
}