【发布时间】:2018-07-12 11:17:00
【问题描述】:
我正在构建一个函数,给定一个整数,反转其所有 32 位(包括符号位),将其转换为新整数,然后返回它。我几乎完成了,但我遇到了两个问题:
第 1 部分: 如果我给它测试(15);那么
buffer = 11110000000000000000000000000000,确实是 15,所有位都反转了。
但是如果我给它 test(-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;
}
【问题讨论】:
-
-15 在 32 位二进制中为 11111111111111111111111111111110001,在 100011111111111111111111111111111111 中反转;您的代码是正确的(至少在这方面)。
-
等一下,你是不是想用
2 ^ (32 - i)做2的(32-i)次方?^是 XOR 运算符。 -
@ScottHunter:用这种方式表示负数是二进制补码,而不是简单的二进制。
-
这里有一些您可能感兴趣的bit-twiddling tricks。
-
@EricPostpischil:没有“简单的二进制”方式来表示负数。