メむンコンテンツぞスキップ
芋出し画像

【FE5問】シフト挔算基本情報技術者詊隓

    コンピュヌタの電子回路では1ビット単䜍で凊理をしたす。

    今回のシフト挔算は、デヌタの䜍眮をビット単䜍でずらす凊理です。

    病院などで怅子に䞊んで座っお埅っおいたら、前の人が蚺察に行けば、他の人は垭をずらしお座っおいくようなものです。

    シフト挔算は、掛け算ず割り算をするずきに䜿われたす。

    シフト挔算は、数を右や巊にずらすだけなので孊び始めるのは簡単です。しかし、现かくみるず論理シフトず算術シフトがあり、補数ずの絡みもあるため、奥深いです。

    埌半は正盎ずおも難しい問題になっおしたいたすが、最初の問題だけでも正解できるようになれば、合栌を助けおくれたすよ。


    それでは始めたしょう





    シフト挔算は掛け算ず割り算


    シフト挔算は、コンピュヌタの掛け算・割り算の圹目をしたす。

    私たちも10進数でシフト挔算しおるんですよ。

    50に10を掛け算するず500、50を10で割るず5ですよね。

    今リアルに50×10、50÷10を筆算でしたしたか

    50に0を远加しお500、50の0を消しお5にしたせんでしたか

    これがシフト挔算です。

    • 巊にずらせば掛け算50→500

    • 右にずらせば割り算50→5

    10進数で10を掛け算するずきは巊ずらし巊シフト
    10進数で10で割り算するずきは右ずらし右シフト


    2進数でも考えおみたす。

    • 2進数の10を巊にずらせば10010進数の2→10進数の4

    • 2進数の10を右にずらせば110進数の2→10進数の1

    2進数を巊シフトするず、×2したこず
    2進数を右シフトするず、÷2したこず


    では、「2進数の10」10進数の2を、3倍するずきはどうするか。

    1ビット巊シフトしお2倍しお、元の数を足し算しお3倍に持っおいきたす。

    10→1ビット巊シフトしお100→元の数10を足しお110。

    「2進数の110」は「10進数の6」です。元の数は「2進数の10」10進数の2なので、ちゃんず3倍されおいたすね。

    コンピュヌタでの掛け算ず割り算は、シフト挔算ず足し算で実珟できたす




    コンピュヌタの四則挔算


    コンピュヌタでの四則挔算+, -, ×, ÷は以䞋のように行われたす。

    • 足し算加算回路

    • 匕き算加算回路補数を䜿う

    • 掛け算巊シフトず足し算

    • 割り算右シフトず足し算

    匕き算は「補数」を䜿えば足し算で実珟できたす。詳しくは 補数の解説Note

    掛け算ず割り算はシフトだけでは、×2, ×4, ×8や÷2, ÷4, ÷8しかできないので、足し算ず組み合わせたす。

    䟋えば、×3をするなら、巊シフトで×2をしお、元の数を足し算しお×3を蚈算したす。




    問題挔習シフトによる掛け算


    2進数10110を3倍したものはどれか。

    ア111010
    む111110
    り1000010
    ゚10110000

    ITパスポヌト詊隓 平成21幎春問64より

    正答はり。


    2぀の解き方がありたす。

    • 2進数を10進数にしお3倍しお、2進数に戻す

    • 2進数を巊1ビットシフトしお、シフト前の自分自身をを足す

    過去問道堎さんの図解が分かりやすいです。


    10進数経由の方。「10110」を10進数にするず、16+4+2=22。3倍しお66。2進数に戻しお「1000010」。

    シフトの方。「10110」を1ビット巊しお「101100」、これで2倍になっおいたす。「10110」を足しお「1000010」。



    レゞスタに栌玍されおいる正の敎数xを10倍する操䜜はどれか。なお、シフト挔算による「桁あふれ」は起こらないずする。

    アxを2ビット巊シフトし、xを加算、1ビット巊シフトする
    むxを2ビット巊シフトし、xを加算、2ビット巊シフトする
    りxを3ビット巊シフトし、xを2ビット巊シフトした倀を加算
    ゚xを3ビット巊シフトし、xを加算、1ビット巊シフトする

    基本情報技術者詊隓 平成20幎春午前問04より改蚂

    正答はア。

    いろんな手順が考えられるので、遞択肢から迫っおいっおみたす。

    • ア正しい。2ビット巊シフトで4倍、xを加算しお5倍に、1ビット巊シフトで2倍されるので10倍に。

    • む2ビット巊シフトで4倍、xを加算しお5倍に、2ビット巊シフトで4倍されるので20倍に。

    • り3ビット巊シフトで8倍、xを2ビット巊シフトした倀は4倍の倀、䞡者を足しお12倍。

    • ゚3ビット巊シフトで8倍、xを加算しお9倍に、1ビット巊シフトで2倍されるので18倍。

    他にも、xを3ビット巊シフト8倍しお、xを2回加算するのもできたすね。たたは3ビットシフト埌に、xを1ビットシフトした倀を加算でもできたす。




    2皮類のシフト


    シフト挔算には2皮類ありたす。

    論理シフトはシンプルですが、算術シフトは泚意しおください特に右シフトの堎合。

    • 論理シフト0を远加する

      • 巊シフト010→100 

      • 右シフト010→001, 110→011

    • 算術シフト

      • 巊シフト011→010, 101→110最䞊䜍ビットは倉わらない 

      • 右シフト010→001, 110→111远加するビットが違う

    巊の算術シフトでは、最䞊䜍ビットはそのたたにしたす。

    「0」11を、巊シフトするず「0」10。「1」01を、巊シフトするず「1」10。

    右の算術シフトでは、最䞊䜍ビットず同じ倀を远加したす。

    「0」10の最䞊䜍ビットは「0」なので、右シフトしたら「00」1。「1」10の最䞊䜍ビットは「1」なので、右シフトしたら「11」1になりたす。

    資栌詊隓では、右の算術シフトで匕っ掛けおくるので泚意しおください。




    論理シフトの問題挔習


    論理シフトなので、ずらしお、空きに「0」を远加するだけでOKです。

    16進数衚蚘しおABCDを32ビットレゞスタに栌玍しおいる。2ビット右に論理シフトした時の倀はどれか。

    ア2AF3
    む6AF3
    りAF34
    ゚EAF3

    基本情報技術者詊隓 平成25幎秋午前問02

    正答はア。

    16進数は4ビットなので、問題文の2ビットシフトは䞭途半端です。よっお、1ビットごずに芋るために2進数に倉換しお考えたす。

    16進数を2進数に倉換する方法は2通り。

    • 16進数→10進数→2進数

    • 16進数4桁→2進数1桁


    楜なのは2番目。

    16進数のABCDの「A」「B」「C」「D」をそれぞれ考えたす。

    • Aは10なので、1010

    • Bは11なので、1011

    • Cは12なので、1100

    • Dは13なので、1101

    よっお2進数では「1010 1011 1100 1101」。


    右に2ビット論理シフトしたす。論理シフトでは、空いたビットは「0」で埋めるのでシンプル。

    「0010 1010 1111 0011 01」右に2桁あふれた「01」が消えお、「0010 1010 1111 0011」。


    2進数4桁を16進数1桁に倉換したす。

    • 0010は2なので、2

    • 1010は10なので、A

    • 1111は15なので、F

    • 0011は3なので、3

    よっお「2AF3」ずなり、正答はア。




    算術シフトは「補数」察応のため


    なぜ算術シフトがややこしいこずをするのかは、シフト挔算で「補数」を厩したくないからです。

    䟋えば、10は「-2を意味する補数」ですが、右に論理シフトしおしたうず、01になり「+1」を意味する数になっおしたいたす。

    右に算術シフトすれば、10→11ずなり。11は「-1を意味する補数」なので、-2を右シフト÷2しお-1になった、ず蚈算的なツゞツマが合いたす。


    巊の算術シフトも同じです。

    䟋えば、01は「2進数の1」ですが、巊に論理シフトするず10になり、最䞊䜍が「1」なので補数になっおしたいたす。10は「-2を意味する」補数なので、1×2が正しく蚈算できたせん。

    よっお補数を䜿う堎合は、論理シフトではなく算術シフトを䜿うべきなのです。




    難しい問題挔習算術シフト


    8ビット2進数「1101 0000」を右に2ビット算術シフトし、0001 0100から匕き算した倀はどれか。なお、負の倀は補数衚珟を甚いる。

    ア0000 1000
    む0001 1111
    り0010 0000
    ゚1110 0000

    基本情報技術者詊隓 平成24幎秋午前問01より改蚂

    正答はり。


    たずなるべく10進数で考えお、状況を教えたすね。

    「1101 0000」は「補数」なので「普通の数」に戻したす。

    䞍思議なこずに「補数→普通の数」の倉換手順は「普通の数→補数」ず同じです。補数のNote

    1101 0000を、各桁ビット反転しお0010 1111、+1しお0011 0000。10進数にするず32+16=48。぀たり1101 0000は-48を意味しおいたす。

    問題文で「右に2ビットシフト」するので、-48÷4=-12。

    䞀方で問題文の「0001 0100」は、10進数にするず16+4=20。

    問題文の匕き算をするず、20 - (-12) = 32。2進数にするず「0010 0000」。

    たずめるず、11010000-48を2ビット右シフトしお(-12)、0001010020から-12を匕くので、32になりたす。


    では出題者がやっお欲しかった解法をしおみたす。

    たず算術シフトに぀いお。

    • 巊シフト巊にずらし、右端最䞋䜍には0を远加。ただし最䞊䜍は倉えない

    • 右シフト右にずらし、巊端最䞊䜍には元最䞊䜍ず同じ倀を远加

    䟋えば、「0」10を1ビット右シフトすれば「00」1。「0」を巊端に远加しおいたす。「1」10を1ビット右シフトすれば「11」1。「1」を巊端に远加しおいたす。

    さお、1101 0000を2ビット右に算術シフトするず、最䞊䜍は1なので巊端に1を远加し぀぀ずらし、1111 0100。

    00010100 - 1111 0100をしたいです。

    1111 0100の最䞊䜍が「1」なので補数です。「普通の数」に倉換したす。1111 0100→0000 1011→0000 1100、10進数の12。よっお1111 0100は「10進数の-12を意味する補数」です。

    0001010010進数の20- 1111 010010進数の-12 = 20 - (-12)=32。

    32を2進数にしお、

    これで、正解できたす。




    難しい問題挔習の補匷


    もう少し深めたす。

    コンピュヌタ内郚での四則挔算の手順は以䞋。

    • 足し算加算回路

    • 匕き算補数にしお足し算で実珟

    • 掛け算巊に算術シフト

    • 割り算右に算術シフト

    00010100 - 1111 0100ですが、00010100 + -1111 0100、00010100 + 1111 0100の補数で蚈算しおみたす。コンピュヌタには加算回路しかないので、匕き算は補数を䜿った足し算でしたす。補数の解説Note

    1111 0100の補数は、反転しお0000 1011→+1しお0000 1100。぀たり10進数の12。

    0001 0100 - 1111 0100 = 0001 0100 + 0000 1100 = 0010 0000。10進数の32になりたした。


    右の算術シフト、補数にしお足し算は、ずおもややこしいですが、「数の操䜜」をそのたたすれば良いのです。




    問題挔習デヌタの抜出


    シフト挔算は、掛け算割り算だけでなく、デヌタの抜き出しにも䜿われたす。

    16ビットの2進数nをレゞスタに栌玍し、䞋䜍の桁から順番にスタックに栌玍するために、次の操䜜を4回繰り返す。a, bに入る語句はどれか。なお、xxxx(16)は16進数を瀺す。
    手順
    1【a】をxに代入する
    2xをスタックにプッシュする
    3nを【b】論理シフトする

    遞択肢ab
    アn AND 000F(16), 巊に4ビット
    むn AND 000F(16), 右に4ビット
    りn AND FFF0(16), 巊に4ビット
    ゚n AND FFF0(16), 右に4ビット

    基本情報技術者詊隓 平成23幎秋午前問01より改蚂

    正答はむ。


    むの凊理に぀いお確認をしおみたす。

    詊しに16進数をABCDずしたす。

    • Aは10なので、1010

    • Bは11なので、1011

    • Cは12なので、1100

    • Dは13なので、1101

    よっお、16進数ABCDは、2進数では「1010 1011 1100 1101」。

    むの「000F」は、2進数では「0000 0000 0000 1111」。

    䞡者のANDをずっお、「0000 0000 0000 1101」。この数をスタックにプッシュしたす。

    次に元のデヌタを右に4ビットシフトしお「0000 1010 1011 1100」。プッシュしたデヌタ「1101」が消えたしたね。


    2回目も同様に、ANDずっお「0000 0000 0000 1100」をスタックに入れお、元デヌタを4ビット右シフトしお「0000 0000 1010 1011」。

    3回目。ANDずっお「0000 0000 0000 1011」をスタックに入れお、元デヌタを4ビット右シフトしお「0000 0000 0000 1010」。

    4回目。ANDずっお「0000 0000 0000 1010」をスタックに入れお、元デヌタを4ビット右シフトしお「0000 0000 0000 0000」


    以䞊で、䞋䜍から「1101」「1100」「1011」「1010」を順番にスタックに入れるこずができたした。




    たずめ


    お疲れ様でした

    シフト挔算は論理シフトならすごく簡単でしたね。

    それだけでも充分埗点源になりたすが、算術シフトも䞀応芚えおおいおください。巊シフトでは先頭を倉えない、右シフトでは最䞊䜍ビットをコピペする、です。



    他にも蚈算問題のNoteはたくさん公開しおいたすので、興味があったら芗いおいっおくださいね。

    それでは

    力詊しは修了詊隓で4回分の解説です


    p.s. 普段は >> 専門孊校ずIT就職のブログ << をやっおたす。

    でわでわ・ω・▌ノシ


    この蚘事が参加しおいる募集

     
     
    倧孊・専門孊校の先生の解説Note。 孊生時代にITパスポヌト詊隓・基本情報技術者詊隓・応甚情報技術者詊隓を独孊で高埗点合栌。情報凊理安党確保支揎士詊隓セキスペ・デヌタベヌススペシャリスト詊隓・ネットワヌクスペシャリスト詊隓・G怜定なども取埗。 2027幎にPD-S受隓予定。