0

簡単にするために、この関数に渡す整数がバイナリ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のバイナリ値が得られます。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%確信はありません. また、これが10進数を2進数に変換するための最良の方法であるかどうかもわかりません。integer(何らかの理由で aになると、他のいくつかの問題とともに割り当てられたメモリを解放しようとするときに0、最終的に a を逆参照しようとすることになることを既に認識しています)この変換を行うためのより良い方法またはより適切な方法は?NULL pointeritob()

4

3 に答える 3

1

それは正しい推論のようです

唯一のことは、上記の関数がバイナリ結果を逆に返すことです。これはおそらく望ましくありません...

バイナリ表現は両方の方法で同じであるため、番号 9 (1001) ではこれを見つけることはできませんが、番号 4 (0100) ではわかります。

于 2012-09-06T19:07:00.473 に答える
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

私のリンクのものをモデルにしています。未テストですが、問題ないはずです。

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 に答える