gpt4 book ai didi

c - 如何将二进制转换为十进制?

转载 作者:行者123 更新时间:2023-11-30 20:22:27 25 4
gpt4 key购买 nike

我今天快速编码(在查找各种谷歌搜索的帮助下)完成了将二进制转换为十进制的基本作业。这只是将有符号转换为 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");
}

显然我可以清理它,但这不是我担心的。这似乎有效,但我觉得让某些东西发挥作用和理解让它发挥作用的每个细节是不同的。

如果您对此问题有任何反馈,我将不胜感激。事情会追上我吗?

我将回顾一下代码并尝试理解它,但如果有任何帮助,我们将不胜感激。

最佳答案

让我们从以下事实开始:此代码将二进制转换为十进制。也许这就是你的意思:

This is just the part that converts signed to 2's complement.

此代码(尝试)执行的操作是对二进制字符串表示的值取反。喜欢:

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)

这使得您的代码比需要的更加复杂。

相反,您可以将事物保留为真实的 01 - 打印时除外:

// 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");
}

关于c - 如何将二进制转换为十进制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39422805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com