
12ビットのデータ(符号付き)を16ビットのデータに変換したいです。
自分なりに考えたのですが・・・
最上位ビット(符号を表すビット)の位置が違うので左に4ビットシフト、
右に4ビットシフトします(どちらも算術シフトとします)
例
0000 1011 1101 0101 (12bit のデータ)
→1011 1101 0101 0000 (左にシフト)
→1111 1011 1101 0101 (右にシフト)
こうするとたしかに16ビットのデータの最上位ビットには12ビットのデータの符号が
反映されるように思えるんですが、符号を除いた値そのものが変わってしまいますよね?
どうしたらいいでしょうか
切羽詰まってて文章めちゃくちゃで分かりづらいかとは思いますが、解答よろしくお願いします。
No.2ベストアンサー
- 回答日時:
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の補数を理解していないのでわからないです。
他にも表現方法があったのですね、勉強になります。
私は学生で、授業の課題としてこの問題に取り組んでいるのですが、おそらく初歩的な表現方法の形式であると思っています(初歩的というのがあるのか分かりませんが・・・)
私は問題に取り組む前に補数と表現方法についてよく勉強する必要がありそうですね。
No.3
- 回答日時:
シフトでないといけないのでしょうか。
12bitのデータは例えばAD変換した外部装置からのデータでしょうか。
16bit変数(整数)に取り込んで、2047(7FF)を境として計算してしまえば済むと思うのですが。
(C/C++で質問されているのですからアセンブラではないですよね)
16bit変数nに12bitのデータを格納したとして、
if(n>2047) n=n-4096;
でいいのかな。
この回答への補足
samtomsanさんご回答ありがとうございます。
質問の仕方が雑で申し訳ないです・・・
補足させていただきます
>>シフトでないといけないのでしょうか。
私は学生でして、ビットシフトを学ぶ課題としてこの問題に取り組んでいます。
なので、シフトを用いた方法を教えていただけたら嬉しいです。
しかしながらそのような方法でも処理できるのですね、勉強になります。
>>12bitのデータは例えばAD変換した外部装置からのデータでしょうか。
はい、実際に計測を行う訳ではありませんが、トルクセンサから得たデータがバイナリ形式のファイルで配布され、それを適切にデータ処理せよ のような課題に取り組んでいます。
>>(C/C++で質問されているのですからアセンブラではないですよね)
はい、その通りです。
No.1
- 回答日時:
「符号付き」と言っても数の表現方法は 1通りではありません.
どのような表現方法を念頭において「符号を除いた値そのものが変わってしまいますよね」と言われているのでしょうか?
そして, このような疑問を持つということは, 当然「値が変わっている」ことを確認できているわけですよね? 今の場合, 「どのような値がどのような値になった」から「変わった」ことを認識できたのですか?
この回答への補足
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が見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
2の補数を計算するプログラム
C言語・C++・C#
-
12bit画像データについて
画像編集・動画編集・音楽編集
-
Excel 16進数
Excel(エクセル)
-
4
AD変換のLSB(量子化単位)の求め方。
その他(コンピューター・テクノロジー)
-
5
0xffffとは?
C言語・C++・C#
-
6
複数桁10進数の*桁目だけを抽出したい
C言語・C++・C#
-
7
ビットシフトってどんな時使うの?
C言語・C++・C#
-
8
家電は交流で動くものと、直流で動くものがあるそうですが、代表的なものを
環境・エネルギー資源
-
9
16bitはダイナミックレンジが97.8dB
その他(AV機器・カメラ)
-
10
バッファとは何ですか
C言語・C++・C#
-
11
C#でbyte配列から画像を表示させたい
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
Accessで該当データにフラグを...
-
5
S9タイプからXタイプにデータ...
-
6
C# ソケット通信でデータ受信時...
-
7
二分探索の平均探索回数
-
8
エクセルで2つの時系列のデー...
-
9
issetでボタンが押されたかを確...
-
10
阿武町4630万円誤送金事件。町...
-
11
curlのオプション
-
12
この行は既に別のテーブルに属...
-
13
VBAを使ってOutlookメール本文...
-
14
多量のSUMIF式を軽くしたい
-
15
COBOL数値転記をCOPY句内での仕様
-
16
ブレーカー落ちで壊れたりしな...
-
17
EXCELVBAでSQLserverからデータ...
-
18
C言語のバイナリファイルに関す...
-
19
VBAでシートからコンボボックス...
-
20
配列でデータが入っている要素...
おすすめ情報
公式facebook
公式twitter