计算整数在C中占用的位数

时间:2017-03-14 16:44:22

标签: c bit

我正在研究这个简短的算法,它提示用户输入一个整数,输出将是整数占用的位数:但是当我输入非常大的数字时,输出变为负数。我不希望有负面的输出。我怎样才能解决这个问题?还有更好的方法来应用这个过程吗?

 int numberHowBig =0;
printf("How many Bits? ");
scanf(" %d", &numberHowBig);
printf("n\n");


int myIncrementor = 1, myMultiplier = 1,
    finalValue = 1;
while (myIncrementor < numberHowBig){
    myMultiplier *=2;
    finalValue = finalValue + myMultiplier;
    myIncrementor++;
}
if ((numberHowBig == 0) || (numberHowBig == 1)){
    printf("Top value: %d\n\n", numberHowBig);
} else {
    printf("Top value: %d\n\n", finalValue);
}

4 个答案:

答案 0 :(得分:0)

您可以使用%u而不是%d打印数字的unsigned int版本。 您的问题源于“int”类型限制为4个字节的内存,并且您以指数方式递增(通过添加myMultiplier),因此它对于4个字节来说太大了所以它会让事情变得混乱。

答案 1 :(得分:0)

是的,还有更好的方法。您可以像这样使用按位移位:

if ((numberHowBig == 0) || (numberHowBig == 1)){
    printf("Top value: %d\n\n", numberHowBig);
} else {
    int finalValue = (1 << numberHowBig) - 1;
    printf("Top value: %d\n\n", finalValue);
}

如果您希望能够处理更大的输出,请使用更大的datatype

答案 2 :(得分:0)

  

还有更好的方法来应用这个过程吗?

一种更好的方法(对于正数)是将数字转换为无符号数,然后计算将其减少到零所需的右移数。如果从零开始,这是一种特殊情况,答案是1位。

负数更有问题,你算1或0吗?在第一种情况下,答案是“类型的位宽”,但是1的一些只是符号扩展位,它们真的算了吗?在第二种情况下,只需转换为无符号,取按位否定并重复正数的过程。

答案 3 :(得分:0)

使用libmath这是另一种选择:

printf( "Top Value %u \n",
    (unsigned int) exp2((double) numberHowBig)-1 );