• ベストアンサー

演算子 Ruby認定試験対策問題

Ruby認定試験対策問題をやっていたら分からないところがあったので、 教えてください。 2.4.演算子 ■問題 次の各行を独立して実行した場合、エラーとなる行があった。エラーとなった行について正しく述べているのはどれか。 A: 1 << 1 B: 1 << 1.0 C: 1.0 << 1 D: 1.0 << 1.0 ■回答 正解は(1)「C行, D行がエラーとなった。」 ■解説 Float には、<< 演算子が定義されていません。また、Integer型に、<< 演算子の引数として、浮動小数点を渡しても、引数は自動的にInteger型に変換され、正しく処理されます。 とあるのですが、問題の意味、なぜ回答が(1)になるか、また、解説の「Integer型に、<< 演算子の引数として、浮動小数点を渡しても」がどの部分を指すのかが分かりません。 自分が調べた限りでは、 << はIntegerクラスのメソッド(シフト演算子)で、ビットを左にシフトするものということだけなのですが……。 この場合、問題の主旨は、例えば「Aだと、1 を 1 ビット左にシフトする」、「Bだと、1 を 1.0 ビット左にシフトする」、「Cだと、1.0 を 1 ビット左にシフトする」という意味なのでしょうか。 また、演算子の引数というのは、<<より右側を指すのでしょうか?

  • re999
  • お礼率61% (476/777)
  • Ruby
  • 回答数2
  • ありがとう数23

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

  • ベストアンサー
  • siffon9
  • ベストアンサー率64% (136/211)
回答No.2

まず、1と1.0は違うクラスのインスタンスだということです。 1は、Integer型(を継承したFixnum型) 1.0は、Float型 これを踏まえて4つの例を説明すると以下のようになります。 A: 1 << 1 Integerクラスのインスタンスである1 その演算子(メソッド)<< に引数として Integerクラスのインスタンスである1を渡す  Integerクラスの演算子<<は、引数で与えられたビット分だけ自分を左シフトする  だから、1を1ビット左シフトして結果は2になる。 B: 1 << 1.0 Integerクラスのインスタンスである1 その演算子(メソッド)<< に引数として Floatクラスのインスタンスである1.0を渡す  Integerクラスの演算子<<は、引数で与えられたビット分だけ自分を左シフトする  演算子<<の引数がFloatで与えられた場合は自動的にIntegerに変換される  すなわち1.0は、1に変換される。  だから結果はAと同じく2になる。 C: 1.0 << 1 Floatクラスのインスタンスである1.0 その演算子(メソッド)<< に引数として Integerクラスのインスタンスである1を渡す  Floatクラスには、演算子<<が定義されていない  だから、エラーになる。 D: 1.0 << 1.0 Floatクラスのインスタンスである1.0 その演算子(メソッド)<< に引数として Floatクラスのインスタンスである1.0を渡す  Cと同じ結果になる。

re999
質問者

お礼

■ご回答ありがとうございます。 ひとつひとつ丁寧に(処理結果も含め)、 ご解説いただいたので、 大変分かりやすかったです。 ▼その中でも特に下記2点が参考になりました。 ▽1と1.0は違うクラスのインスタンスだということ ▽B.演算子<<の引数がFloatで与えられた場合は自動的にIntegerに変換される。すなわち1.0は、1に変換される。だから結果はAと同じく2になる。 ありがとうございました。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

回答の(2)以降がないのであれなんですが、 Aが問題ないというのは良いですよね? Bは、 >Integer型に、<< 演算子の引数として、浮動小数点を渡しても、引数は自動的にInteger型に変換され、正しく処理されます。 が適用されます。 1 << 1.0 と書くとわかりづらいですが、内部的には 1.<<(1.0) つまり、1というインスタンスが持っているメソッドの呼び出しですので、「引数」という表現がされているのでしょう。 #正確には1が属するクラスのメソッドなのですが略 で、1.<<(1.0)を処理するときに、1.0はIntegerに変換されるのでエラーになりません。 C,Dがエラーになるのは良いですよね? irb(main):001:0> 1.<<(1) => 2 irb(main):002:0> 1<<1 => 2 irb(main):003:0> 1<<1.0 => 2 irb(main):004:0> 1<<(1.0) => 2 irb(main):005:0>

re999
質問者

お礼

ご回答ありがとうございます。 ■下記説明箇所、大変分かりやすかったです。 1.<<(1.0) つまり、1というインスタンスが持っているメソッドの呼び出しですので、「引数」という表現がされているのでしょう。

関連するQ&A

  • 浮動小数点演算と固定小数点演算の使い分けについて

    解説書などには、「浮動小数点は3.14E0の形」や「固定小数点は3.14」などと説明されています。 では、例えば、ごく一般的な32ビットマシンで「3.14 * 45.6」という命令を書いたときに演算されるのは浮動小数点演算なのか、固定小数点演算なのかがわかりません。例えばIntelのx86CPUは、内部にFPUを持っているそうですが、この場合は「3.14 * 45.6」は、内部では必ず浮動小数点演算になっているということなのでしょうか? 「3.14 * 45.6」を「3.14E0 * 4.56E1」と書いた場合にしか浮動小数点演算されないということではないと思っているのですが、実際の浮動小数点演算と固定小数点演算の内部的な切り替えがわかりません。 理解が足りなくて、おかしな質問になっていましたら、その点もご指摘いただければうれしいです。

  • ビット演算で00000001と1の頭に0を付ける?

    https://www.grapecity.com/japan/powernews/column/clang/019/page02.htm ビット演算子 表1にCのビット演算子を掲げておきます。ビット演算とは言っても、扱う値はバイト単位などCの一般的な整数のデータ型です。ビット演算子は、それらの値をビット単位で計算します。 ビットシフト演算(<< >>)~2倍と1/2 例えばunsigned char型の1は、2進数では"00000001"という形のビット列(ビットパターン)になります。これを1桁左にずらす(シフトする)と"00000010"となります。ずらしてあふれた左端の0は消え、空いた右端には0が入ります。 "00000001"は10進数の「1」、"00000010"は10進数の「2」です。つまり、ビット列を左に1桁シフトすると値は2倍になるのです。 -----------------------------------------  以上ですが、C言語の、ビット演算の解説の抜粋です。ビット演算はまだ覚えたてですが、"00000001"整数1の頭にわざわざ、0を沢山 つける目的は何なのでしょうか!?  よろしくお願いします。

  • シフト演算子について・・・意味がわかりません(T_T)

    左シフト演算子<<は最上位ビットの上位を削除して最下位に0を追加、 右シフト演算子>>は最下位ビットが削除されて、最上位ビットに最上位ビットと同じ値が補充される、 論理右シフト>>>は最下位ビット削除され、最上位に0が補充される。 と、ここまではわかりました・・・ ある問題で int n = -1>> 31; でnはいくつになるか?というのがあったんですが、 解説の意味がわかりません。 回答はー1です。 「>>演算子によるシフトでは符号ビットが拡張される」 意味がわかりません・・・(@_@) 「>>>演算子であったなら、符号ビットがゼロになるのでN=1となる」 え・・・???!!! ふごーびっと??? シフト演算子ですから、 「-1の31こ右にビットをシフトする」 んだな・・・と思ったところ、 まったくどう考えてよいのかわからず、 回答を見たところ、余計わからなくなりました。 だれかたすけてください(T_T)

    • ベストアンサー
    • Java
  • 2進演算について。

    以下の問題でのこの答えが合っているか自信が無いので確認と間違いがあれば指摘をお願いします。 (1)次の整数を8bitsの符号+絶対値表現、2の補数表現、127増し表現で表現しなさい。    -20    +55 (2)次の10進小数を、32ビットの浮動小数点表示しなさい。    -123.8125 答(1) -20 (+絶対値表現)→ 1001 0100 (2の補数表現) → 0001 0100 (127増し表現) → ? -20の+絶対値表現というのはそのまま20の8bit表示でいいんでしょうか? マイナスなので一番左のビットに1を立てればいいだけでしょうか? それと-20の2の補数表現は-20の2進表現を逆数にして1足すので結局20の2進数でいいのでしょうか? +55 (+絶対値表現)→ 0011 0111 (2の補数表現) → 1100 1001 (127増し表現) → ? これは+なので普通に考えてこの答えで間違いがあるでしょうか? それといずれの問題でも「127増し表現」というのはどうすればいいのでしょうか? 答(2) -123.8125の32ビット浮動小数点表示は 123.8125(10進)→ 111 1011.1101(2進) 0.11110111101×2^7 (正規化) で、32ビットの浮動小数点表示は 1 00000111 11110111101000000000000 なると思うのですが、どうでしょうか? 解答と指摘をお願いします。

  • IEEE754と浮動小数点定数同士の演算について

    ■質問 浮動小数点の標準規格IEEE754に、浮動小数点定数同士の演算に関する規定はありますか? ■背景 とあるマイコンで組込みソフト開発をしています。 このマイコン用のコンパイラ(IEEEに準拠)で以下のCソースコードをコンパイルしたところ、コンパイラのバージョン1とバージョン2で演算結果が異なりました。 double d_val = 6.6f * 10.0f; ○コンパイルバージョン1でコンパイルしたソフトの演算結果 →d_valには66.0が代入されました。 ○コンパイルバージョン2でコンパイルしたソフトの演算結果 →d_valには65.999999…(詳細は失念)が代入されました。 コンパイラメーカーに問い合わせたところ、「バージョン1から2へのアップグレードにおいて、浮動小数点定数演算に関連する変更を行ったが、その影響は浮動小数点演算における誤差の範囲内である」との回答でした。 誤差の範囲内であるとはいえ、コンパイラのバージョン違いで演算結果が異なるのは困るので、これがIEEE754規格違反なのであれば、それを根拠にコンパイラメーカーへ対応を求められるのではないかと考えています。 しかし、浮動小数点定数同士の演算結果の正確性についての規定がないのであれば、開発側で対応するしかありません。 いろいろと調べてはいるのですが、これといった情報に行き当たっていないので、こちらで質問させていただきます。どうぞよろしくお願いいたします。

  • Accessクエリの整数型と単精度型の演算について

    Accessのクエリで長整数型と単精度浮動小数点型を 加算すると答えが一致しません。理由を知っている人いますか? ちなみに長整数型と倍精度浮動小数点型を加算したときは答えが一致します。 浮動小数点は誤差がつきものなのは分かりますが、 確か単精度浮動小数点型は有効桁数7桁までのはず。 下記の例では問題ないように見えます。 (例)長整数型と単精度浮動小数型の演算:1000+0.20=1000.20000000298 長整数型と倍精度浮動小数型の演算:1000+0.20=1000.2 それではよろしくお願いします。

  • Excelでビット演算子?

    Excelでビット演算子の 左シフト演算をさせることは でるでしょうか? 0xff<<8 の演算をさせたいのですが 何か関数はあるでしょうか?

  • シフト演算の問題です

     2進数の値を左へn桁移動すると、もとの値の2^n倍になる。 例えば、左へ2ビット桁移動するともとの値の4倍となる。  この性質を利用して、左へ桁移動した値を複数加えることで行う乗算を考える。 なお、ここでは、桁移動して空いたビットには0が入るものとし、負数は考えないものとする。 左へ桁移動する関数として、"SHIFT(値、桁数)"を使う。 この関数は、引数の"値"を"桁数"ビット左へ桁移動した結果を返す。  もとの値をaとし、これを10倍するには、2倍した値と8倍した値を加えればよいので、次のような式になる。  SHIFT(a,1)+SHIFT(a,3) また別の考え方で10倍しようとすると、次のような式になる。  SHIFT((SHIFT(a,x)+a),y) 答えはx=2 y=1 です。 解説をお願いします。

  • 浮動小数演算は実行環境の変化に応じて異なる結果に?

    プログラム(C++)について質問があります. 浮動小数演算を用いると,実行環境の変化に応じて結果が変わってしまうのでしょうか? プログラム中ではdouble演算を頻繁に用いています. (ソースコードは膨大すぎるため,申し訳ありませんが載せることが出来ません.) 小数演算をするために何気なくdouble(もしくはfloat)を使っていました. しかし,コンパイル後の実行ファイルを実行する環境に応じて結果が変わってしまうのでは・・・と思い始めました. そこで,ご質問なのですが, ・浮動小数を扱うと,実行環境(プロセッサ?)に応じて,結果は変わってしまいますか? また,もし誤差が生じてしまうならば,何か対処する方法はありますでしょうか? (整数演算にしろ!・・・と言うのは無しにさせて頂きます.) 初歩的な質問だと思いますが,宜しくお願い致します.

  • 剰余演算を論理演算と加減算に置き換える方法

    剰余(割算の余り)を求める演算を論理演算と加減算とビットシフトのみで行う方法がありましたら教えてください。 言語はC/C++ではなくても大丈夫です(ロジックだけでも)。