- ベストアンサー
ビットシフトで12ビットのデータを16ビットに変換する方法
- ビットシフトを使用して、12ビットのデータを16ビットのデータに変換する方法について考えています。
- 最上位ビットの位置が異なるため、左に4ビットシフトし、右に4ビットシフトします。
- これにより、16ビットのデータの最上位ビットには12ビットのデータの符号が反映されるようになりますが、値自体も変わってしまいます。解決策はありますか?
- みんなの回答 (3)
- 専門家の回答
関連するQ&A
- 算術シフトしたら、あれ?
16進数ので各4ビット(4桁)で2進数で算術シフトしますが、符号部はぬいて元の16進数に戻すのですか?でもそうすると元の数より大幅に減ってしまいますよね。例題の 例題・A4A6(16)を2ビット算術シフトする。 A4A6(16)=1010 0010 1010 0110 (2) ・左へ2ビットシフトする。 1000 1010 1001 1000(2)=A98(16) ・右へ2ビットシフトする。 1110 1000 1010 1001(2)=8A9(16) というように、符号部ぬかしたら増えるはずが減ったり、減るはずが増えたりと。なんか変ですよね。 ちなみに符号部すべて入れて考えたら、 左へ算術シフト 8A98(16) 右へ算術シフト E8A9(16) 増えるはずが減って、減るはずが増えるというあべこべになってしまいます。 超基本的ことなんですが、なぜか本に記載されていなかったので書きました。ご協力ください。
- ベストアンサー
- その他([技術者向] コンピューター)
- 「左算術シフト」について
「算術シフト」についての質問です。 算術シフトには「右シフト」「左シフト」というものがあり、 「右算術シフト」の場合は、右シフトする時、一番左側の数(符号)が 「0」の場合→一番左側から「0」を補う。 「1」の場合→一番左側から「1」を補う。 ということですが、「左算術シフト」だとこんな感じでよろしいのでしょうか? 一番左側の数(符号)→そのまま(固定のまま) 二番目の左側の数(符号)→捨てる 三番目以降の左側の数(符号)→左へスライド 最後(一番右側)の数(符号)→右からゼロを補う ↑私の考えだと「左算術シフト」はこういうのものだと思いますが、こんな解釈でよろしいのでしょうか? よろしくお願いします。
- ベストアンサー
- その他([技術者向] コンピューター)
- シフト演算子について・・・意味がわかりません(T_T)
左シフト演算子<<は最上位ビットの上位を削除して最下位に0を追加、 右シフト演算子>>は最下位ビットが削除されて、最上位ビットに最上位ビットと同じ値が補充される、 論理右シフト>>>は最下位ビット削除され、最上位に0が補充される。 と、ここまではわかりました・・・ ある問題で int n = -1>> 31; でnはいくつになるか?というのがあったんですが、 解説の意味がわかりません。 回答はー1です。 「>>演算子によるシフトでは符号ビットが拡張される」 意味がわかりません・・・(@_@) 「>>>演算子であったなら、符号ビットがゼロになるのでN=1となる」 え・・・???!!! ふごーびっと??? シフト演算子ですから、 「-1の31こ右にビットをシフトする」 んだな・・・と思ったところ、 まったくどう考えてよいのかわからず、 回答を見たところ、余計わからなくなりました。 だれかたすけてください(T_T)
- ベストアンサー
- Java
- 算術シフトについて
基本的なことで申し訳ないのですが、コンピューターのシフト演算命令において、算術右シフトでは、なぜ「符号ビット」と同じビットを空いたビットに補充することになるのでしょうか?
- 締切済み
- その他([技術者向] コンピューター)
- 算術シフト演算が成り立つ理由がイマイチ・・・
算術シフト演算で右シフトにしても左シフトにしてもシフトで空いたビットに符号ビットと同じ物を入れたり0を入れたり、溢れたビットを破棄したり・・・ というのがどうして成り立つのかがイマイチわかりません。 手元の本を見てもWebで探してもそういうことは細かく書かれていなくてよくわからないのです。 レポートで書かなければいけないのにこのままでは答えが出るのが間に合いそうもなく助けを借りたいと思い質問させて頂きました。 どなたかわかる人が居ましたらよろしくお願いします。
- 締切済み
- C・C++・C#
- シフト演算について
基本情報技術者試験の資格試験のための勉強をしているものです。 現在、カテゴリー的には基礎理論の離散数学、 シフト演算のうち、「論理シフト」ではなく、 「算術シフト」で理解できない点があります。 左シフトは理解できたつもりなんですが・・・ 右シフトがいまいちよくわかりません。 以下に例題を表記します。 【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言語にまつわるご回答ですともっとわからなくなりそうです。 単純に間違いを指摘していただけると大変助かります。 よろしくお願いします。
- ベストアンサー
- 情報処理技術者
- 算術シフトと論理シフトの違いは?
「コンピュータはなぜ動くのか 知っておきたいハードウエア&ソフトウエアの基礎知識」書籍内のP61のところにある「表3.1 Z80 CPUの主な命令」の表の「演算命令」の欄に 「SLA:算術左シフトをする」 「SRA:算術右シフトをする」 「SRL:論理右シフトをする」 というのがあるのですが、この「算術シフト」と「論理シフト」はどう違うのでしょうか? 「シフト」と言うと 「データを右にずらす。」 「データを左にずらす。」 というイメージがあるのですが、これと似たようなものなんでしょうか? わかりやすく教えてください。できればわかりやすい「例え」で教えてくれたほうが幸いです。 よろしくお願いいたします。
- ベストアンサー
- 情報工学
- 情報処理の本を読んでいたんですが・・・
この画像の左下に、右算術シフトで空いたスペースに入るのは、0決めうちじゃなくて符号ビットなのです。そうじゃないと左にシフトさせたらすぐオーバーフローですよ。 と書いてあるのですが、 「そうじゃないと左にシフトさせたらすぐオーバーフローですよ」 という部分がよくわかりません。 なぜ左シフトさせたらすぐオーバーフローになるのでしょうか・・・
- ベストアンサー
- Java
補足
k_kotaさんご回答ありがとうございます。 値は変わらないのですか!不思議です。 windowsでの電卓など、簡単に確かめる方法があれば教えてほしいです。 >>12bitがあって、それが先頭ビットが符号である2の補数表現の形式の整数である。 その数が持ってる値を16bit整数に入れたい。ということでいいですかね。 申し訳ないのですが、2の補数を理解していないのでわからないです。 他にも表現方法があったのですね、勉強になります。 私は学生で、授業の課題としてこの問題に取り組んでいるのですが、おそらく初歩的な表現方法の形式であると思っています(初歩的というのがあるのか分かりませんが・・・) 私は問題に取り組む前に補数と表現方法についてよく勉強する必要がありそうですね。