プロが教える店舗&オフィスのセキュリティ対策術

12ビットのデータ(符号付き)を16ビットのデータに変換したいです。

自分なりに考えたのですが・・・
最上位ビット(符号を表すビット)の位置が違うので左に4ビットシフト、
右に4ビットシフトします(どちらも算術シフトとします)


 0000 1011 1101 0101 (12bit のデータ)
→1011 1101 0101 0000 (左にシフト)
→1111 1011 1101 0101 (右にシフト)

こうするとたしかに16ビットのデータの最上位ビットには12ビットのデータの符号が
反映されるように思えるんですが、符号を除いた値そのものが変わってしまいますよね?
どうしたらいいでしょうか


切羽詰まってて文章めちゃくちゃで分かりづらいかとは思いますが、解答よろしくお願いします。

A 回答 (3件)

12bitがあって、それが先頭ビットが符号である2の補数表現の形式の整数である。


その数が持ってる値を16bit整数に入れたい。ということでいいですかね。

結論から言うと、符号ビットと同じものを頭4桁に入れる、というのでOKでしょう。

シフトでやった例ですけど、値は変わってません。
わかりやすいのは-1ですけど12bitなら(111111111111)_2です。
んで、16bitなら(1111111111111111)_2です。
符号桁以外の追加も0じゃないのですが、これが正しいです。
そもそも2の補数表現を知らないとか別な表現しているのであればこれは誤りですけど、そうであればどういう条件なのか教えてください。


単純に12ビット目を16ビット目に移したいなら12bitデータと、それを右に11シフト、左に15シフトしたものを足せばいいでしょう。

この回答への補足

k_kotaさんご回答ありがとうございます。


値は変わらないのですか!不思議です。
windowsでの電卓など、簡単に確かめる方法があれば教えてほしいです。


>>12bitがあって、それが先頭ビットが符号である2の補数表現の形式の整数である。
その数が持ってる値を16bit整数に入れたい。ということでいいですかね。

申し訳ないのですが、2の補数を理解していないのでわからないです。
他にも表現方法があったのですね、勉強になります。
私は学生で、授業の課題としてこの問題に取り組んでいるのですが、おそらく初歩的な表現方法の形式であると思っています(初歩的というのがあるのか分かりませんが・・・)


私は問題に取り組む前に補数と表現方法についてよく勉強する必要がありそうですね。

補足日時:2011/07/17 08:47
    • good
    • 0

シフトでないといけないのでしょうか。



12bitのデータは例えばAD変換した外部装置からのデータでしょうか。

16bit変数(整数)に取り込んで、2047(7FF)を境として計算してしまえば済むと思うのですが。
(C/C++で質問されているのですからアセンブラではないですよね)

16bit変数nに12bitのデータを格納したとして、
if(n>2047) n=n-4096;
でいいのかな。

この回答への補足

samtomsanさんご回答ありがとうございます。
質問の仕方が雑で申し訳ないです・・・
補足させていただきます

>>シフトでないといけないのでしょうか。
私は学生でして、ビットシフトを学ぶ課題としてこの問題に取り組んでいます。
なので、シフトを用いた方法を教えていただけたら嬉しいです。
しかしながらそのような方法でも処理できるのですね、勉強になります。

>>12bitのデータは例えばAD変換した外部装置からのデータでしょうか。
はい、実際に計測を行う訳ではありませんが、トルクセンサから得たデータがバイナリ形式のファイルで配布され、それを適切にデータ処理せよ のような課題に取り組んでいます。

>>(C/C++で質問されているのですからアセンブラではないですよね)
はい、その通りです。

補足日時:2011/07/17 09:05
    • good
    • 0

「符号付き」と言っても数の表現方法は 1通りではありません.


どのような表現方法を念頭において「符号を除いた値そのものが変わってしまいますよね」と言われているのでしょうか?

そして, このような疑問を持つということは, 当然「値が変わっている」ことを確認できているわけですよね? 今の場合, 「どのような値がどのような値になった」から「変わった」ことを認識できたのですか?

この回答への補足

Tacosanご回答ありがとうございます。補足させていただきます。

>>どのような表現方法を念頭において「符号を除いた値そのものが変わってしまいますよね」と言われているのでしょうか?

私の中では、最上位ビットがデータの符号を決め、(16ビットであるとすれば)残りの
15ビットがデータの絶対値というべきか、符号に続く数値の部分を表しているものだと
考えています。(私は学生なのですが、先生が『最上位ビットは符号を決める』とおっしゃいました)
そこで元の(12bit)データが

  1011 1101 0101

であったのに対して変換後の(16bit)データが

1111 1011 1101 0101

となってしまっては、先頭から2,3,4,5番目のビットに余計な 1 が入ってしまっているのでは?
と思ったのです (この場合1000 0011 1101 0101となるべきではないのでしょうか?)


>>「変わった」ことを認識できたのですか?

すいません、確認はしてないです。ただの思い込みです・・・
上位5ビットがすべて 1 で良いわけを教えていただけたら嬉しいです

補足日時:2011/07/17 08:21
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!