• 締切済み

シフト演算の必要性

左シフトとか、右シフトとか 何の意味があるのですか?

みんなの回答

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.3

#2です。「必ず必要」と書いてしまいましたが訂正及び補足です。 何故Javaがシフト演算を実装している理由ですが ほとんどのCPUはCPUの命令としてビットシフトする命令を持っています。 四則演算でビットシフトしたのと同じように値を変化させることもできますが、 CPU自体にそういう命令があるなら 言語もそういう命令を実装をするのが自然だと思います。 (つまり絶対必要なわけではありません。シフト演算子の無い言語もあります。) シフト演算はC/C++の仕様であったものですから、その影響を受けたJavaも 敢えてその仕様を省く事はなかったのでしょう。

yuuitirou
質問者

お礼

初心者の自分には 難しい話ではありますが 回答ありがとうございます。 理解できるように 頑張ります。

全文を見る
すると、全ての回答が全文表示されます。
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

ある種の変換を行うのに必ず必要になります。 例えばデータの暗号化に使われる事もあります。 Base64へのエンコード、デコードや、UTF8とUTF16、UTF32の相互変換プログラムを Javaのライブラリを使わず自分で書けば必要性を理解できると思います。 他にも左シフトを行うと、値は2倍になりますよね?右シフトは半分になります。 この特性を知っておくことで 例えば多倍長の乗除演算をより効率的に行う事ができます。 (BigDecimalも内部で使っていると思います。)

全文を見る
すると、全ての回答が全文表示されます。
  • auty
  • ベストアンサー率58% (284/486)
回答No.1

論理演算といわれるものの1種ですが、適用する対象によっては、よりCPUに近い側で演算されるため、 ・ 計算速度のアップ ・ メモリの節約 などが考えられます。

yuuitirou
質問者

お礼

分かりました より分かるように自分でも 調べてみます。 ありがとうございます

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • シフト演算子について

    初歩的な質問ですがどなたか回答・解説お願いします。 a << 1 の場合、aを左へ1ビットシフトするという意味ですが、 もしこれが、 1 << a になった場合はどういう意味になりますか??? aを右に1ビットシフトするでよろしいんですか? よろしくお願いします。

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

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

    • ベストアンサー
    • Java
  • シフト演算について

    基本情報技術者試験の資格試験のための勉強をしているものです。 現在、カテゴリー的には基礎理論の離散数学、 シフト演算のうち、「論理シフト」ではなく、 「算術シフト」で理解できない点があります。 左シフトは理解できたつもりなんですが・・・ 右シフトがいまいちよくわかりません。 以下に例題を表記します。 【10001100を2ビット左シフト】 先頭ビットは符号ビットということで、マイナスの数値になるのだと思います。すると、 【元の数】 10001100 =-(0001100) =-(8+4) =-12 【2桁左シフト結果=元の数×2^2】 10110000 =-(0110000) =-(32+16) =-48 となり、 元の数=-12 結果 =-48 で、結果が元の数×2^2で結果が合っているようです。 (と思っているだけなんですが) 元の数の考え方自体に間違いがありそうですが・・・ とりあえず進みます。 同様に 【10001100を2ビット右シフト】すると 【2桁右シフト結果=元の数×2^-2(=元の数×1/4)】 11100011 =-(1100011) =-(64+32+8+4) =-99 となり、 元の数=-12 結果 =-99 で、結果が元の数×2^-2(=元の数×1/4)と結果が合いません。 先頭符号を空いたビットに移動した部分は数えないのでしょうか。 すると、 元の値 =-12 結果  =-3 で結果が合う気がします。 過去の回答や検索サイトなどで調べてみましたがピンときません。 テキストにも、10進数での数値表記はなく、 答え合わせができなくて困っております。 どなたかお答えいただけると助かります。 どこが間違っているのか混乱しております。 先頭ビットが正負の符号ビットという前提の例題なのですが、 マイナス符号がついている前提となるので 先頭ビットや空いたビットに入れた符号ビットも含めて 「2の補数」で考える必要があるのかどうかも よくわからなくなってきました。 つまり、元の数値「10001100」は「-12」ではなく -(01110100) =-(64+32+16+4) =-116 なのでしょうか なお、C言語は今のところ学習していないので、 C言語にまつわるご回答ですともっとわからなくなりそうです。 単純に間違いを指摘していただけると大変助かります。 よろしくお願いします。

  • [2進数 シフト演算 除算について]

    [2進数 シフト演算 除算について] シフト演算について勉強中です。ご協力お願い出来たら幸いです。 乗算について例えば『1010』(符号ビットを考えず)を2倍 4倍 8倍(2のn乗)した場合 ビットを2倍であれば1つ、4倍であれば2つ・・・左に シフトすれば良いというのは理解しました。 また3倍 5倍などのケースも、 3倍であれば1ケタ左にシフトした数+1010で求まる事も理解しました。 問題は除算です。他の質問を探ってみたのですが、考え方は一緒という回答で・・・詰まっています 除算は右シフトとの事ですが 先ほどの例である『1010』(10)ですがこれを1/2、つまり2で割ると 1つ右にシフトし1010→0101 となり 1010を1/4する場合右に2ビットシフトし 1010→0010.10 となり理解は出来ます。 しかし1/3 、1/5といった場合の計算の仕方が分かりません。 余りを出さないという考えで(近似値になると思いますが) 解き方をご教授願えたらと思います。

  • 算術シフト演算が成り立つ理由がイマイチ・・・

    算術シフト演算で右シフトにしても左シフトにしてもシフトで空いたビットに符号ビットと同じ物を入れたり0を入れたり、溢れたビットを破棄したり・・・ というのがどうして成り立つのかがイマイチわかりません。 手元の本を見てもWebで探してもそういうことは細かく書かれていなくてよくわからないのです。 レポートで書かなければいけないのにこのままでは答えが出るのが間に合いそうもなく助けを借りたいと思い質問させて頂きました。 どなたかわかる人が居ましたらよろしくお願いします。

  • シフト演算の左シフトが何で72になるのでしょうか?

    ■やりたいこと ・100を左に1ビット(1けた)シフトさせたら2倍になることを確かめたい ■試したこと ・100を2進数へ変換 → 1100100 ・左に1ビット(1けた)シフト → 1001000 ・1001000を10進数へ変換 → 72 ■質問 ・どこで間違えているのでしょうか?

  • シフト演算子

    わたしの使用している参考書で 8ビットのデータを左に2ビットシフトすると、 1111 1111 ↓ 1111 1100 となるとあります。この場合、シフトした値が元の値の4倍になると勉強したのですが、実際には元の値より減っているように思えるのですが・・。教えてください。よろしくお願いします。

  • シフト演算で質問です

    1バイトの 10010111を右に1シフトすると2^-1になるはずですが 151から75となり 2^-1になっていません。 なぜそうなるのでしょうか? これでは正確な演算を行うことができません。。。 よろしくお願いします! あと、論理シフトと算術シフトの使い分けもできれば教えていただきたいです!

  • 算術シフトと論理シフトの違いは?

    「コンピュータはなぜ動くのか 知っておきたいハードウエア&ソフトウエアの基礎知識」書籍内のP61のところにある「表3.1 Z80 CPUの主な命令」の表の「演算命令」の欄に 「SLA:算術左シフトをする」 「SRA:算術右シフトをする」 「SRL:論理右シフトをする」 というのがあるのですが、この「算術シフト」と「論理シフト」はどう違うのでしょうか? 「シフト」と言うと 「データを右にずらす。」 「データを左にずらす。」 というイメージがあるのですが、これと似たようなものなんでしょうか? わかりやすく教えてください。できればわかりやすい「例え」で教えてくれたほうが幸いです。 よろしくお願いいたします。

  • 「左算術シフト」について

    「算術シフト」についての質問です。 算術シフトには「右シフト」「左シフト」というものがあり、 「右算術シフト」の場合は、右シフトする時、一番左側の数(符号)が 「0」の場合→一番左側から「0」を補う。 「1」の場合→一番左側から「1」を補う。 ということですが、「左算術シフト」だとこんな感じでよろしいのでしょうか? 一番左側の数(符号)→そのまま(固定のまま) 二番目の左側の数(符号)→捨てる 三番目以降の左側の数(符号)→左へスライド 最後(一番右側)の数(符号)→右からゼロを補う ↑私の考えだと「左算術シフト」はこういうのものだと思いますが、こんな解釈でよろしいのでしょうか? よろしくお願いします。