将一个整数转换成二进制形式,考虑负数情况。
这个问题在思维模式上没有什么难得,只是要在编程中注意到一些细节,注意+0和-0的情况。大致思想是:
#1.求出对应绝对值的原码
#2.除最高位,按位取反
#3.位低位加1
/*************************************************************************
> File Name: b.c
> Author: 傻李
> Mail: hellojukay@gmail.com
> Created Time: 2014年11月15日 星期六 20时01分35秒
************************************************************************/
#include<string.h>
#include<stdio.h>
#include<math.h>
int result[sizeof(int) * 8];
void translate(int a)
{
int c,i;
int tmp;//保存目标的绝对值
tmp = abs(a);
memset(result,0,sizeof(int) * 8);
if(a == 0)
{
for(i = 0; i < sizeof(int) * 8; ++i)
result[i] = 0;
return ;
}
for(i = 0; i < sizeof(int) * 8 - 1; ++i)
{
result[i] = tmp % 2;
tmp = tmp / 2;
}
//默认符号位0
result[i] = 0;
//负数求补码过程
if(a < 0)
{
result[sizeof(int) * 8 - 1] = 1;
for(i =0 ; i < sizeof(int) * 8 - 1;++i)
{
//除最高最位,按位取反
switch(result[i])
{
case 1:
result[i] = 0;
break;
case 0:
result[i] = 1;
break;
}
}
//尾数加1
c = 1;
for(i = 0; i < sizeof(int) && c != 0; ++i)
{
tmp = result[i];//此处tmp保存临时值
result[i] = result[i] ^ c;
c = tmp & c;
}
}
}
int main()
{
int a;
scanf("%d",&a);
translate(a);
int i;
for(i = sizeof(int)*8 -1; i >= 0; --i)
{
printf("%d",result[i]);
}
return 0;
}
11月16日更
本来像写大数乘法的,想来想去,觉得很便起来会很繁琐,有很多细节要处理,于是有用c++把大数加法由实现了一遍,原理还是一样的,只是没有数组产度的限制了。
/*************************************************************************
> File Name: big_mult.cpp
> Author: 傻李
> Mail: hellojukay@gmail.com
> Created Time: 2014年11月16日 星期日 20时54分52秒
************************************************************************/
#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<int> big_add(string str1,string str2)
{
int len1,len2;
//进位
int c = 0;
int sum;
len1 = str1.size() > str2.size() ? str1.size():str2.size();
len2 = str1.size() < str2.size() ? str1.size():str2.size();
vector<int> a,b;
vector<int> result;//保存计算结果
//保证a中保存的是那个大的数字
if(str1.size() > str2.size())
{
for(auto s : str1)
{
a.push_back(s-'0');
}
for(auto s : str2)
{
b.push_back(s -'0');
}
}
else
{
for(auto s : str2)
{
a.push_back(s-'0');
}
for(auto s : str1)
{
b.push_back(s-'0');
}
}
for(int i = 1 ; i <= len1; ++i )
{
for(; i <= len2; ++i)
{
sum = a[len1 - i] + b[len2 - i] + c;
result.push_back(sum%10);
c = sum / 10;
}
sum = a[len1 -i] +c;
result.push_back(sum%10);
c = sum / 10;
}
return result;
}
int main()
{
string str1,str2;
vector<int> result;
cin >> str1;
cin.clear();
cin >> str2;
result = big_add(str1,str2);
for(int i = result.size()-1; i >= 0; --i)
cout << result[i];
return 0;
}