为了简单起见,让我们假设我传递给这个函数的整数9
是1001
二进制的。
一段时间以来,我的目标是在C
. 我用来以简写形式计算数字二进制值的方法如下(使用9
如上所述):
9 / 2 = 4.5 (remainder) = 1
4 / 2 = 2 (no remainder) = 0
2 / 2 = 1 (no remainder) = 0
1 / 1 = 1 (remainder) = 1
因此,如果您反转我们得到的结果,您将得到仍然是1 0 0 1
的二进制值。9
1 0 0 1
但是在查看这个站点之后,我发现整数的二进制值可以通过一些“简单”的按位算术找到。我在本网站的另一篇文章中找到了一个函数,并将其改编为我自己的函数:
char *itob(int integer)
{
char *bin = 0X00, *tmp;
int bff = 0;
while(integer)
{
if(!(tmp = realloc(bin, bff + 1)))
{
free(bin);
printf("\nError! Memory allocation failed while building binary string.");
return 0x00;
}
bin = tmp;
if(integer & 1) bin[bff++] = '1';
else bin[bff++] = '0';
integer >>= 1;
}
bin[bff+1] = 0x00;
return bin;
}
以下是我如何理解正在发生的事情以及我的问题(显示为评论)
1001 & 1 = 1 so put a 1 into the buffer //what is & doing that makes it equate to 1? Is it because the first digit in that sequence is a 1?
shift the bits in 1001 to the right one time
0010 & 1 != 1 so move a 0 into the buffer //same question as before is & just looking at the 0 because it is the first digit in the sequence?
shift the bits in 0010 to the right one time
0100 & 1 != 1 so move a 0 into the buffer //same question as before
shift the bits in 0100 to the right one time
1000 & 1 = 1 so put a 1 into the buffer //same question as before (at this point I'm thinking my theory is correct but I'm still not entirely sure)
shift the bits in 1000 to the right one time
loop ends
因此,正如我在评论中提到的,这就是我认为我的程序中正在发生的事情,但我不是 100% 确定。另外我不确定这是否是将十进制转换为二进制的最佳方法。(我已经知道,如果integer
出于某种原因成为 a,0
我最终会NULL pointer
在尝试释放分配的内存itob()
以及其他一些问题时尝试取消引用 a)但是除了我之前已经问过的问题之外,还有一个更好的方法或更合适的方法来进行这种转换?