• ベストアンサー

演算子について

2進数の文字列を数値に変換する処理の中で、 for(i= 0; binary[i] != 0; i++) { value <<= 1; value |= binary[i] - '0'; } value <<= 1; はvalueを左へ1ビットシフトするということがわかりますが、 次の value |= binary[i] - '0'; は、 書き直すと、 value = value | binary[i] - '0'; となり、『|』ではvalueとbianary[i]をORすることがわかりますが、その次の『 - '0' 』では何を行っているのかよくわかりません。 どなたかお解りの方、解説のほうお願いします。

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

  • ベストアンサー
  • osumitan
  • ベストアンサー率33% (102/307)
回答No.5

No.2の回答の補足です。 ------------------------- valueやiの型がわからないので、仮にcharだとします。  char value, i; まずvalueの初期値は0です。 ・i=0のとき value=0なので、1ビット左シフトしても0のままです(00000000→00000000) binary[0]は"10001"の1文字目の'1'になります。 '1'のアスキーコードは0x31、'0'のアスキーコードは0x30ですので binary[0] - '0' → '1' - '0' → 0x31 - 0x30 → 1 ということになります。 この1をvalue(=0)とORをとると、1になります。  00000000(=0)と00000001(=1)の各ビットを照らし合わせて、  いずれかでも1になっていたら1、いずれも0なら0、とやっていけば  いちばん左の位だけ1であとは0なので、0 | 1 = 1 ですね。 この結果である1を、valueに格納します。 ・i=1のとき value=1なので、1ビット左シフトで2になります(00000001→00000010) binary[1]は"10001"の2文字目の'0'になります。 binary[1] - '0' = '0' - '0' で0になります。 value=2とこの0をORすると、00000010と00000000なので00000010=2です。 以下、同じように続いていきます。 binary[i] - '0'は、binaryに'0'か'1'しか入っていないのであれば ループカウンタiが指す桁により0か1かいずれかの値を取ります。 つまり2進数なら、1の位が0か1かで、その上の桁はすべて0です。 1の位だけ値が入っていて、他には入っていないと考えられます。 逆にvalueを左シフトしたものは、1の位は必ず0になります。 そしてその上の桁は、さっきの値が入っています。 つまり、上の桁に値が入っていて、1の位は入っていないと考えられます。 この2つでORをとれば、お互いに自分に値が入っている部分は 相手が入っておらず、自分が入っていないところは相手が入っているので そのお互いの値がある部分をくっつけたものになります。 つまり、binaryを先頭から1桁ずつvalueにくっつけていく形になります。

kaiji12345
質問者

お礼

回答のほう補足説明していただいてありがとうございます。 おかげさまで理解することができました。

その他の回答 (4)

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

>なぜvalue:数値とbinary:2進数をORしてやるんでしょうか?? (binaryは、この場合文字列です、コンピュータであらわす数値に変換してやらないといけません "11010011"(binary)とかを 11010011(value)にしてやる必要があります。 ) 論理演算でORをすると任意のビットをセットできます。 つまり、この場合、シフトして空いたところ(1の位)を 0か1でORを取る(0の場合は何も変化せず1の場合1のビットが立つ)ことで、数値をセットしています。 >ORした後に、『- '0'』を行うって考えていいんですか?? ORする前に『- '0'』を行います (演算子の優先順位に注意)

kaiji12345
質問者

お礼

ご回答ありがとうございます。 まだ自分の中でなぜこうなるのか理解できてないので解説を参考に考えてみます。 ご丁寧にありがとうございました。 またよろしくお願いします。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.3

value |= binary[i] - '0'; を書き直したものは value = value | binary[i] - '0'; ではありません。(これは誤りです。) 正しくは value = value | (binary[i] - '0'); です。 これならば処理内容が理解できるでしょうか。

kaiji12345
質問者

お礼

ご回答ありがとうございます。 そうですね。優先順位で演算が変わりますね。 演算子がまだよくわかってないので、処理しているところも皆さんの解説を参考に考えてみます。

  • osumitan
  • ベストアンサー率33% (102/307)
回答No.2

binary[i]はおそらく、'0'か'1'の文字が入っているのでしょう。 文字コード的に'0'=0x30、'1'=0x31となっているので、 '0'(0x30)を引けば、'0'のとき0x00、'1'のとき0x01となり、 数値に変換したような格好になります。 ORをするのは引き算のあとです。 valueを1ビット左シフトしているので valueの1の位は0になっています。 binaryの先頭が'0'なら0、'1'なら1でORしているので valueの今までの桁の値は変わらずに 左シフトであいた1の位に0か1が入ります。 それをbinaryの全桁やっていけば、 valueはbinaryを数値化した値になるでしょう。 (おそらくvalueは0で初期化されているでしょう)

kaiji12345
質問者

お礼

ご回答ありがとうございます。 解説のほうを参考にまた自分で行っている処理を考えてみます。 またわからないところがあればよろしくお願いします。 丁寧な解説ありがとうございました。

kaiji12345
質問者

補足

すみません。自分なりに考えたのですがまだわからない部分があります。 解説のおかげで行っていることは大まかにわかるのですが。。。 例えば与えられている2進数が10001の場合どのように変化していくのでしょうか? valueの初期値は0なので0を左へ1ビットシフトすると00でいいんですか? 考えてたらパニくっちゃって余計わからなくなってしまいました。 すみませんがよろしくお願いします。

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

文字列を数値に直しています 2進文字列なので、 '1'または'0'ですから '1'-'0'=1 '0'-'0'=0 になります。 文字コード的に "0123456789"と並んでいるからそういう風にできます。

kaiji12345
質問者

お礼

回答のほうありがとうございます。

kaiji12345
質問者

補足

早速の回答ありがとうございます。 value |= binary[i] - '0'; は2進数の文字列をただ単に数値に直すという処理と考えてよろしいんでしょうか?? すみません。もう一つお願いします。なぜvalue:数値とbinary:2進数をORしてやるんでしょうか??ORした後に、『- '0'』を行うって考えていいんですか?? 初歩的な質問ですみません。

関連するQ&A

専門家に質問してみよう