我今天快速编写(在查找各种谷歌搜索的帮助下)进行基本分配,将二进制转换为十进制。这只是将签名转换为2的补码的部分。
void binary_to_decimal (char *value){
int i;
int numdigits = strlen(value);
int c=0;
char nvalue[numdigits];
char sum[numdigits];
char b[numdigits];
for(i=0;i<numdigits;i++)
b[i]='0';
b[numdigits-1]='1';
if (numdigits%4==0 && value[0]=='1') {
for(i=0;i<numdigits;i++){
if(value[i]=='1')
nvalue[i]='0';
else if(value[i]=='0')
nvalue[i]='1';
}
for(i=0;i<numdigits;i++)
printf("%c", nvalue[i]);
printf("\n");
for(i=0;i<numdigits;i++)
printf("%c", b[i]);
printf("\n");
for(i=numdigits-1; i>=0; i--){
nvalue[i]=nvalue[i]-'0';
b[i]=b[i]-'0';
sum[i]=(nvalue[i]^b[i]^c)+'0';
c=(nvalue[i]&b[i]) | (b[i]&c) | (nvalue[i]&c);
}
if (c!=0)
sum[0]=1;
for(i=0;i<numdigits;i++)
printf("%c", sum[i]);
}
else {
}
printf("\n");
}
显然我可以清理它,但这不是我担心的。 这看起来很有效,但我觉得它有所不同,可以让它起作用并理解让它发挥作用的每一个细节。
我很感激有关此问题的任何反馈。事情会赶上我吗?
我将重新审视代码并尝试理解它,但任何帮助都将不胜感激。
答案 0 :(得分:1)
让我们从这个代码 not convert binary to decimal
开始。也许这就是你的意思:
这只是将签名转换为2补码的部分。
这段代码(尝试)做的是否定二进制字符串表示的值。像:
a = -a;
^
Negate
基本原则是:
1)反转原始二进制字符串中的每一位
2)在第一步的结果中加1。
4位二进制的示例:
0111 (is 7 )
1) Invert: 1000 (is -8)
2) Add 1: 1001 (is -7)
因此,您的第一个循环执行反转,第二个循环添加1
。
但是,您的代码不正确。如果numdigits%4==0 && value[0]=='1'
为false,则永远不会初始化nvalue
,并且您的代码具有未定义的行为(在第二个循环中)。我无法弄清楚你使用if
语句的原因。它不应该存在。你应该总是执行第一个循环。
此外 - 这些线条似乎很奇怪:
}
else {
}
他们不符合任何开场陈述。
在您的代码中,您使用'0'
和'1'
执行所有计算,而不是仅使用0
和1
。因此,你经常需要在它们之间进行转换,即
`0` - `0` to convert to a real 0
`1` - `0` to convert to a real 1
和
0 + `0` to convert to a `0` (i.e. a printable 0)
1 + `0` to convert to a `1` (i.e. a printable 1)
使您的代码比需要的复杂得多。
相反,您可以将内容保持为真实0
和1
- 除非在打印时:
// This function negates a binary string by
// a) Inverting each bit
// b) Adding 1 to the inverted string
void negate_binary (char *value){
int i;
int numdigits = strlen(value);
int c=0;
char nvalue[numdigits];
char sum[numdigits];
char b[numdigits];
// Set b to 1, i.e. 00000...0001
for(i=0;i<numdigits;i++)
b[i]=0;
b[numdigits-1]=1;
// Invert all bits in the input string
for(i=0;i<numdigits;i++){
if(value[i]=='1')
nvalue[i]=0;
else if(value[i]=='0')
nvalue[i]=1;
else
exit(1); // Illegal input
for(i=0;i<numdigits;i++)
printf("%c", nvalue[i] + '0');
printf("\n");
for(i=0;i<numdigits;i++)
printf("%c", b[i] + '0');
printf("\n");
// Do sum = nvalue + b (i.e. sum = nvalue + 1)
for(i=numdigits-1; i>=0; i--){
sum[i]=(nvalue[i]^b[i]^c); // Add with carry
c=(nvalue[i]&b[i]) | (b[i]&c) | (nvalue[i]&c); // Calculate new carry
}
if (c!=0)
sum[0]=1;
for(i=0;i<numdigits;i++)
printf("%c", sum[i] + '0');
}
else {
}
printf("\n");
}