了解此函数中的按位运算

时间:2012-09-06 18:39:23

标签: c binary bit-manipulation

为了简单起见,我们假设我传递给这个函数的整数是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

正如我在评论中所提到的,这是我认为在我的计划中发生的事情,但我不是百分百肯定。此外,我不确定这是否是将十进制转换为二进制的最佳方法。 (我已经知道,如果integer无论出于何种原因都是0,我最终会尝试取消引用NULL pointer时尝试释放由{{1}分配的内存除了一些其他打嗝之外)但除了我之前已经提到过的问题,还有更好的方法或更合适的方法来进行这种转换吗?

3 个答案:

答案 0 :(得分:1)

不,测试和班次的顺序是

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

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

答案 1 :(得分:1)

那似乎是正确的推理

唯一的事情就是上面的函数反过来给出了反向的二进制结果,这可能是不想要的......

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

答案 2 :(得分: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;
}