我很惭愧地承认,我对位和位操作的了解不够深入。本周末,我尝试通过编写一些“反转位顺序”和“计算ON位数”的函数来解决这个问题。我从这里中借鉴了一个例子,但当我按照下面的实现时,我发现我必须在循环时使用< 29。如果我使用< 32(就像在例子中),那么当我尝试打印整数(使用我编写的printBits函数)时,我似乎会丢失前三位。这对我来说毫无意义,有人能帮帮我吗?
感谢大家的帮助,我已经添加了注释以显示我所做的更改。
感谢大家的帮助,我已经添加了注释以显示我所做的更改。
int reverse(int n)
{
int r = 0;
int i = 0;
for(i = 0; i < 29; i++) //Should be i < 32
{
r = (r << 1) + (n & 1); //| instead of + to make it obvious I'm handling bits
n >>=1;
}
return r;
}
这是我的printBits函数:
void printBits(int n)
{
int mask = 0X10000000; //unsigned int mask = 0X80000000;
while (mask)
{
if (mask & n)
{
printf("1");
}
else
{
printf("0");
}
mask >>= 1;
}
printf("\n");
}
还有一个可用的反转函数
int reverse2(int n)
{
int r = n;
int s = sizeof(n) * 7; // int s = (sizeof(n) * 8) -1
for (n >>= 1; n; n >>=1)
{
r <<=1;
r |= n & 1;
s--;
r <<= s;
return r;
}