• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ビットシフトについて)

ビットシフトで12ビットのデータを16ビットに変換する方法

このQ&Aのポイント
  • ビットシフトを使用して、12ビットのデータを16ビットのデータに変換する方法について考えています。
  • 最上位ビットの位置が異なるため、左に4ビットシフトし、右に4ビットシフトします。
  • これにより、16ビットのデータの最上位ビットには12ビットのデータの符号が反映されるようになりますが、値自体も変わってしまいます。解決策はありますか?

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

  • ベストアンサー
  • k_kota
  • ベストアンサー率19% (434/2186)
回答No.2

12bitがあって、それが先頭ビットが符号である2の補数表現の形式の整数である。 その数が持ってる値を16bit整数に入れたい。ということでいいですかね。 結論から言うと、符号ビットと同じものを頭4桁に入れる、というのでOKでしょう。 シフトでやった例ですけど、値は変わってません。 わかりやすいのは-1ですけど12bitなら(111111111111)_2です。 んで、16bitなら(1111111111111111)_2です。 符号桁以外の追加も0じゃないのですが、これが正しいです。 そもそも2の補数表現を知らないとか別な表現しているのであればこれは誤りですけど、そうであればどういう条件なのか教えてください。 単純に12ビット目を16ビット目に移したいなら12bitデータと、それを右に11シフト、左に15シフトしたものを足せばいいでしょう。

porash
質問者

補足

k_kotaさんご回答ありがとうございます。 値は変わらないのですか!不思議です。 windowsでの電卓など、簡単に確かめる方法があれば教えてほしいです。 >>12bitがあって、それが先頭ビットが符号である2の補数表現の形式の整数である。 その数が持ってる値を16bit整数に入れたい。ということでいいですかね。 申し訳ないのですが、2の補数を理解していないのでわからないです。 他にも表現方法があったのですね、勉強になります。 私は学生で、授業の課題としてこの問題に取り組んでいるのですが、おそらく初歩的な表現方法の形式であると思っています(初歩的というのがあるのか分かりませんが・・・) 私は問題に取り組む前に補数と表現方法についてよく勉強する必要がありそうですね。

その他の回答 (2)

  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.3

シフトでないといけないのでしょうか。 12bitのデータは例えばAD変換した外部装置からのデータでしょうか。 16bit変数(整数)に取り込んで、2047(7FF)を境として計算してしまえば済むと思うのですが。 (C/C++で質問されているのですからアセンブラではないですよね) 16bit変数nに12bitのデータを格納したとして、 if(n>2047) n=n-4096; でいいのかな。

porash
質問者

補足

samtomsanさんご回答ありがとうございます。 質問の仕方が雑で申し訳ないです・・・ 補足させていただきます >>シフトでないといけないのでしょうか。 私は学生でして、ビットシフトを学ぶ課題としてこの問題に取り組んでいます。 なので、シフトを用いた方法を教えていただけたら嬉しいです。 しかしながらそのような方法でも処理できるのですね、勉強になります。 >>12bitのデータは例えばAD変換した外部装置からのデータでしょうか。 はい、実際に計測を行う訳ではありませんが、トルクセンサから得たデータがバイナリ形式のファイルで配布され、それを適切にデータ処理せよ のような課題に取り組んでいます。 >>(C/C++で質問されているのですからアセンブラではないですよね) はい、その通りです。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「符号付き」と言っても数の表現方法は 1通りではありません. どのような表現方法を念頭において「符号を除いた値そのものが変わってしまいますよね」と言われているのでしょうか? そして, このような疑問を持つということは, 当然「値が変わっている」ことを確認できているわけですよね? 今の場合, 「どのような値がどのような値になった」から「変わった」ことを認識できたのですか?

porash
質問者

補足

Tacosanご回答ありがとうございます。補足させていただきます。 >>どのような表現方法を念頭において「符号を除いた値そのものが変わってしまいますよね」と言われているのでしょうか? 私の中では、最上位ビットがデータの符号を決め、(16ビットであるとすれば)残りの 15ビットがデータの絶対値というべきか、符号に続く数値の部分を表しているものだと 考えています。(私は学生なのですが、先生が『最上位ビットは符号を決める』とおっしゃいました) そこで元の(12bit)データが   1011 1101 0101 であったのに対して変換後の(16bit)データが 1111 1011 1101 0101 となってしまっては、先頭から2,3,4,5番目のビットに余計な 1 が入ってしまっているのでは? と思ったのです (この場合1000 0011 1101 0101となるべきではないのでしょうか?) >>「変わった」ことを認識できたのですか? すいません、確認はしてないです。ただの思い込みです・・・ 上位5ビットがすべて 1 で良いわけを教えていただけたら嬉しいです

関連するQ&A

専門家に質問してみよう