• ベストアンサー

数値を2進数文字列に変換するものなんですが・・・

数値を2進数の文字列に変換するプログラムを関数として作成しているんですが、わからないことがあるのでお願いします。 char *itob(int value, int size, char binary[]) { int count = 0; /* binaryの添え字 */ int bit = size * 8; /* ビットになおす */ int mask = 1 << bit - 1; /* 先頭ビットに1を立てる */ /* 数値を2進数の文字列に変換する処理 */ do { if(value & mask) { /* valueとmaskのAND(論理積) */ binary[count] = '1';/* '1'を代入 */ }else { binary[count] = '0';/* '0'を代入 */ } value <<= 1; /* valueを左へ1ビットシフト */ count++; /* countを1たす */ }while(count < bit); /* 繰り返しを行う条件 */ binary[count] = '\0'; /* 最後に'\0'を入れる */ return binary; /* 変換した値を戻り値として返す */ } この前にもプログラムがありますが、コンパイルして実行する際に 10001 1110 と入力したら、 11111 という答えを出したいのですが、 これを実行すると、 00000000000000000000000000011111 となってしまいます。 これを11111とするためにはプログラムにどのような処理をすればよいのかわかりませんのでどなたかおわかりのかた解説をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

参考URLの#4とか参考になりませんか

参考URL:
http://okweb.jp/kotaeru.php3?qid=1570137
rio_de_car
質問者

お礼

ありがとうございます。 参考にさせていただきます。 自分なりに考えましたが、 int i; for(i=0; (value & mask) == 0; i++) { value <<= 1 } 変数の宣言後に入れて、do-while文の中身を }while(count < bit - i); としてやることで1があるビットがあるまで繰り返しを行う処理を入れることで、11111とできるようになりました。

その他の回答 (2)

  • J_H
  • ベストアンサー率57% (11/19)
回答No.3

現在の結果を利用するのであれば、、、 頭の0を取り除くサンプル[未確認] void f() { char s[] = "000000001100001"; char *p = strchr(s, '1'); int pos; if (p){ pos = p - s; memmove(s, s + pos, sizeof (s) - pos); } printf("%s", s); } ☆ 結果 【期待】 ☆ 1100001

rio_de_car
質問者

お礼

ありがとうございます。 自分なりに解決のほうできましたが、参考にさせていただきます。 サンプルのほうありがとうございます。

  • foobar
  • ベストアンサー率44% (1423/3185)
回答No.1

「10001 1110 と入力したら、」 このとき、value,sizeにはどういう数値がわたるはずで、 実際にはどんな数値がわたっているのでしょうか? まずは、そのあたりを確認されたほうがよいように思います。

rio_de_car
質問者

お礼

ありがとうございます。 確認して考えてみます。

関連するQ&A

専門家に質問してみよう