这段代码是将十进制数转换为二进制数的函数的一部分,将它放在char instBin [33]的特定索引中,该索引由调用函数创建并通过引用传递。它传递十进制数,即您想要的二进制数字的数量(将额外的0加到给定的二进制数的前面)。我已经习惯了这一段时间了,我无法让它将0和1放入数组中。我已经把它一直到了实现instBin [i] ='1';只是根本不工作 - 当我打印instBin时,什么也没发生。我看过其他做这种事情的例子,但看起来在选择索引时给一个字符数组一个变量应该有用......任何想法为什么我的不是?
int printBin(int num, int numBits, int startIndex, char * instBin){
int r, i; /* r for remainder, i for index */
const int FAIL = 0;
i = startIndex + numBits; /* start indexing at end of current segment */
while (num > 0)
{
/* as long as i >= startIndex, we can still add to array */
if (i >= startIndex){
r = num % 2; /* find the remainder */
if (r == 1)
instBin[i] = '1';
else /* r == 0 */
instBin[i] = '0';
num /= 2; /* then actually divide the number */
i--;
}
else /* num is too big to fit in given number of bits */
return FAIL;
}
/* return the 1 for success*/
return 1;
}
答案 0 :(得分:0)
有两个主要问题。第一个是fencepost错误。假设您的意图是将最重要的位置于startIndex
的缓冲区中,您需要从i = startIndex + numBits - 1
开始。如果您需要说服这一点,请考虑使用numBits = 1
的示例。
第二个问题是,当数字足够小以至于需要前导零时,你的循环不提供它们。它一次提供一位数,直到数字达到0,然后停止。在主循环之后需要第二个循环,以添加零。如果你在主循环之后查看i
的值,它会告诉你主循环停止的位置,所以你可以像这样完成这个工作:
while(i >= startIndex)
instBin[i--] = '0';