0

为了简单起见,让我们假设我传递给这个函数的整数91001二进制的。

一段时间以来,我的目标是在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的二进制值。91 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)但是除了我之前已经问过的问题之外,还有一个更好的方法或更合适的方法来进行这种转换?

4

3 回答 3

1

不,测试和轮班的顺序是

1001 & 1 => 1   then shift right
 100 & 1 => 0   "
  10 & 1 => 0   "
   1 & 1 => 1   "

结果整数 0 使循环终止。所以它的作用是测试从最低有效位开始的每个位,并在缓冲区中附加一个 0 或 1。我想说的是倒退,因为当作为字符串打印时,位序列与最常用的位序列相反,其中最低有效位是最右边的位。

于 2012-09-06T18:56:19.303 回答
1

这似乎是正确的推理

唯一的事情是上面的函数将二进制结果反向返回,这可能是不想要的......

你不会用数字 9 (1001) 发现它,因为它的二进制表示在两种方式都是相同的,但你会用数字 4 (0100)

于 2012-09-06T19:07:00.473 回答
1

仿照我链接中的那个。未经测试,但应该没问题。

char * bit2str(unsigned int num ) 
{

    unsigned int bit,pos;
    char *dst;

    dst = malloc(1+CHAR_BIT*sizeof bit) ;
    if (!dst) return NULL;

    for(pos=0,bit = 1u << (CHAR_BIT*sizeof bit -1); bit; bit >>= 1 ) {
         dst[pos++] = num & bit ? '1' : '0' ;
    }
    dst[pos] = 0;
    return dst;
}
于 2012-09-06T19:09:37.913 回答