gpt4 book ai didi

c - C 中的反转位并将二进制转换为十进制

转载 作者:行者123 更新时间:2023-11-30 19:31:31 24 4
gpt4 key购买 nike

我正在构建一个函数,给定一个整数,反转其所有 32 位(包括符号位),将其转换为新整数,然后返回它。我快完成了,但遇到了两个问题:

第 1 部分:如果我给它测试(15);那么

buffer = 11110000000000000000000000000000,实际上是 15,所有位都反转了。

但是如果我给它测试(-15);那么

buffer = 10001111111111111111111111111111,这是不对的,它应该是10001000000000000000000000000001(末尾的1是符号位)。因此,对于负值,构建我的缓冲区字符串会出错。 我应该将其更改为正整数,反转位,然后将末尾的位更改为 1 吗? 或者有一些更简单的方法来构建这个字符串吗?

第 2 部分:

“answer”,我返回的应该代表这些数字的整数,从来都不准确。如果我给它 test(1500)answer = 185,那么它应该是 1000341504。 将 32 位二进制数转换为整数的最佳方法是什么?

我的代码:

int test(int var){
printf("reversing %d:\n", var);
char buffer[32];
int i = 0;
int power = sizeof(var) * 8;
int answer = 0;

while(power > 0){

//check the lowest bit and put a 0 or 1 into the array
if((var & 1) == 1){
buffer[i] = '1';
i++;
}

else{
buffer[i] = '0';
i++;
}
//shift to the next bit
var>>= 1;
power--;
}

i++;
buffer[i] = '\0';

printf("\nbuffer = %s", buffer);

//loop through the array in reverse, building the number
while(i > 0){
if(buffer[i] == '0'){

i--;
}
else{

answer += (2 ^ (32 - i)); //here is where I try to add up answer
i--;
}
}
printf("\nanswer = %d \n\n\n\n", answer);
return 0;
}

最佳答案

您的转换中不正确的部分是:

answer += (2 ^ (32 - i))

2 ^ (32 - i))2 XOR (32 - i),因为 ^ 是 XOR 运算符。

我会像这样进行转换:

unsigned int answer = 0, pow=1;
for(int i = sizeof(buffer) - 1; i >= 0; --i)
{
int bit = buffer[i] - '0';

answer += bit * pow;

pow *= 2;
}

通过向后执行(从 31 到 0),您不必使用 pow 或创建函数执行 2 的 i 次方。这会给你整数值你的二元解释,总是积极的。如果你想要整数值2-补码二进制:

int answer = 0;
unsigned int pow=1;
for(int i = sizeof(buffer) - 1; i > 0; --i)
{
int bit = buffer[i] - '0';

answer += bit * pow;

pow *= 2;
}

if(buffer[0] == '1')
answer |= 0x80000000; // setting last bit

或更通用的解决方案(不关心answer是否签名)

int answer = 0; // or unsigned int answer = 0;
size_t len = strlen(buffer);
for(int i = len - 1; i > 0; --i)
{
if(buffer[i] == '1')
answer |= 1 << len - 1 - i;
}

编辑

我还发现您转换为字符串时出现错误:

char buffer[32];
...
i++;
buffer[i] = '\0';

缓冲区可容纳 32 个字符,每一位对应一个字符。没有空间了那里有 0 终止字节,同样使用 i++ 你会溢出缓冲区,i将为 33,因此溢出 2。

如果您不打算将 buffer 视为字符串(没有 strcpy、没有 strcmp,没有 printf),那么您不必存储终止 '\0'。去除buffer[i] = '\0'; 就是这样。

但是您确实将其打印为字符串,因此您必须将 buffer 声明为

char buffer[33];

并删除 buffer[i] = '\0'; 之前的 i++

在这种情况下,您还需要将 for 循环更改为

for(i = sizeof(buffer) - 2; i >= 0; --i)

for(i = sizeof(buffer) - 2; i > 0; --i)

strlen(buffer) - 1 而不是 sizeof(buffer) - 2 (如果您执行以下操作在另一个函数上进行转换,并将指针传递给 buffer

关于c - C 中的反转位并将二进制转换为十进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48574473/

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