• ベストアンサー

シフト演算について

シフト演算について   正の数の場合,シフト操作によって0が消えていくのは問題ない。   シフト操作によって1が消えると結果が変になる。これが「あふれ」 2の補数表現による負の数の場合,結論はこうなります。   負の数の場合,シフト操作によって1が消えていくのは問題ない。   シフト操作によって0が消えると結果が変になる。これが「あふれ」 以下からの抜粋です。 http://okwave.jp/qa/q4302488.html 負の数の場合,シフト操作によって1が消えていくのは問題ないのはなぜですか?

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

  • ベストアンサー
noname#113216
noname#113216
回答No.1

>負の数の場合, というよりも「補数表現の負の数の場合、ですが。 正の数は、先頭側に0をつけてもそれは数値でなく空位なので、 シフトされ消えても値に影響しません。 「補数表現の負の数」では1が空位なので、「1が消えても問題ない」ということです。

ipyodora
質問者

お礼

回答ありがとうございました。理解できました。

関連するQ&A

  • 四則演算についてです

    四則演算の除算法についてですが {23/6}を2進数で求めたいです。 但し、被除数は6ビット、除数は4ビットという条件付き。 23=(0 10111)2 6=(0 110)2 2の補数を用いて-6=(1 010)2 減算結果が正の場合、商として1をたて 減算結果が負の場合、商として0を立てるのですが 010111 +)1010    商 --------- 111111 …0 +) 1010 --------- 1010011 …0 +) 1010 --------- 1101 …0 +) 1010 --------- 10111 となってしまい商と余りがうまく出ません! 間違ってるところ教えてください!

  • 問:負数を2の補数で表現する符号付き16ビットの2進数を16進法で表示

    問:負数を2の補数で表現する符号付き16ビットの2進数を16進法で表示したもののうち、4倍するとあふれが生じるものはどれか。 ア 1FFF イ DFFF ウ E000 エ FFFF 以下は、それぞれを2進数表示にしたものです。 先頭の符号ビットは[0]の表記で目立たせてあります。 ア [0]001 1111 1111 1111 イ [1]101 1111 1111 1111 ウ [1]110 0000 0000 0000 エ [1]111 1111 1111 1111 以下は、4倍したもの ア [0]111 1111 1111 1100 イ [0]111 1111 1111 1100 ウ [1]011 0000 0000 0000 エ [1]111 1111 1111 1100 この場合は、ア以外は負数ですが、『負数を2の補数で表現する符号付き16ビットの2進数を、16進数で表現した場合』は16進数が正の数でも、2進数だと負数になると言う事でしょうか? また、符号付きでない場合は、上記はすべて正の数と言う事で合ってますか? 回答を見る感じでは16進数を2進数に変換しただけで、『2の補数で表現』の部分がないように思えます。この辺りも知りたいです。 問題の解き方についても疑問があります。 http://questionbox.jp.msn.com/qa4278151.html での回答では、 イ DFFF →(シフト前)1101 1111 1111 1111 →(シフト後)0111 1111 1111 1100 先頭ビットが1から0に変わったので「桁あふれ」。 問題集の回答ではこっちで説明されていました。 http://okwave.jp/qa/q4302488.html のANo2回答では (シフト前)[1]101 1111 1111 1111 (シフト後)[1]111 1111 1111 1100 2の補数表現による負の数の場合,シフト操作によって1が消えていくのは問題ない。 シフト操作によって0が消えると結果が変になる。これが「あふれ」 符号はシフトさせず、左に2つシフトさせた事で、10が消えた事で桁あふれとしています。 ANo1の回答では、 DFFFだと同様に 1101 1111 1111 1111で1の補数は 0010 0000 0000 0000 2の補数は 0010 0000 0000 0001 つまり、-8193ですよね。 4倍すると、-32772で、これは16ビットの2の補数表現 で表現できる数の範囲からあふれてしまいます。 DFFFなどの2進数に変換後、2の補数を使用するのが正しいのでしょうか? 最初の2つの回答では2の補数を使用していなかったので、疑問に思っています。 頭が混乱しております・・・。 回答宜しくお願い致します。

  • シフト演算について

    基本情報技術者試験の資格試験のための勉強をしているものです。 現在、カテゴリー的には基礎理論の離散数学、 シフト演算のうち、「論理シフト」ではなく、 「算術シフト」で理解できない点があります。 左シフトは理解できたつもりなんですが・・・ 右シフトがいまいちよくわかりません。 以下に例題を表記します。 【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言語にまつわるご回答ですともっとわからなくなりそうです。 単純に間違いを指摘していただけると大変助かります。 よろしくお願いします。

  • 受験票到着目前での悪足掻きです。

    負の2進数の割り算が演算シフトの方式で実施される際には、 演算結果へと"補数"が適用されるのでしょうか?

  • 否定演算について

    正の数の否定演算~は必ず負になるのですか? Pythonで~1とすると-2と出るのですが ビット演算を説明している参考サイトによると(8bitを例にすると)だと1つまり00000001の否定は11111110となるようなことが書かれてます そうなると254との違いが解らないのですが、どう判断するのでしょうか? 正は負に負は正になるという記述が見当たらなかったので質問しました。 よろしくお願いいたします。

  • [2進数 シフト演算 除算について]

    [2進数 シフト演算 除算について] シフト演算について勉強中です。ご協力お願い出来たら幸いです。 乗算について例えば『1010』(符号ビットを考えず)を2倍 4倍 8倍(2のn乗)した場合 ビットを2倍であれば1つ、4倍であれば2つ・・・左に シフトすれば良いというのは理解しました。 また3倍 5倍などのケースも、 3倍であれば1ケタ左にシフトした数+1010で求まる事も理解しました。 問題は除算です。他の質問を探ってみたのですが、考え方は一緒という回答で・・・詰まっています 除算は右シフトとの事ですが 先ほどの例である『1010』(10)ですがこれを1/2、つまり2で割ると 1つ右にシフトし1010→0101 となり 1010を1/4する場合右に2ビットシフトし 1010→0010.10 となり理解は出来ます。 しかし1/3 、1/5といった場合の計算の仕方が分かりません。 余りを出さないという考えで(近似値になると思いますが) 解き方をご教授願えたらと思います。

  • 2進法と10進法の演算問題

    2進数→10進数(負の数)<2の補数表現> 8bit(8桁)の一番左のbitは符号bitとする 1)11111111 2)10011100 3)1.0010000 4)1.1100001 上記の問題が分かりません。 4桁ずつに分けて10進法に直して考えればよいのでしょうか? 補数表現自体よく分からないです。

  • ソフ開の問題集について

    こんにちは。さっそくですが質問させていただきます。 日高哲郎氏の著作 「2006秋 ソフトウェア開発技術者 午後問題集」 の第二章アルゴリズム 演習4 BNF についてなのですが、 構文規則で定義される 言語のなかで byte 8ビット 補数表現の整数 short 16ビット 補数表現の整数 char 16ビット 符号なし整数 int 32ビット 補数表現の整数 を扱うのようなのですが <演算子> の定義の中にシフト演算子があり、 '<<' 空いたビットに符号ビットを入れる '<<<' 空いたビットに 0 を入れる とありました。 ----------------------------------------------------- 設問4の(2) の問題文はつぎのようなものでした。 シフト演算子<< は(1)のように除算演算子で置き換え可能である [ (1) については省略させていただきます。] ~中略~ 除算演算子をシフト演算子に置き換え可能なのは 除数および被除数がどのような場合か ----------------------------------------------------- 正解は 除数 2 のべき乗のとき 被除数 char型で32767以下の場合、またはchar型以外のとき なのですが、これはそれぞれの型においての最上位ビットの 扱いからだと思うのですが、 ( char型以外は 2 の補数表現の整数 ) 質問させていただきたいのは本の正解に対する 解説についてなのです。 ----------------------------------------------------- 解説文においては 「・・・符号ビットを意識しないchar型であると 最上位ビットに 1 が入っていると右シフトの結果空いたビットに 0 が入ってしまうため数値としてみた場合、正しい結果が得られない。 ・・・」 とあるのですが、空いたビットに 0 が入れば数値として 正しくなるのではないでしょうか? そしてこの場合、char型の最上位ビットに 1 が入っていると シフトしたら、空いたビットに 1 が入るので数値としては 正しくなくなるのではないでしょうか? 自分の理解に自信が持てないので、このような質問を させていただきましたが、 ご存知のかた、教えていただけないでしょうか? よろしくおねがいします。

  • 2進数の補数表示について

    よろしくお願いします 「負の数(-128)を8ビットの2の補数表示するとき、どうなるか?」 の問題で、わからない箇所があります。 1.最上位ビットは正・負を表す。 2.負の数:-127を2の補数を使用して表現する。    (例)-1(10)==>    まず、正で考える。      ==> 0000 0001(2)      「確認」 1111 1110(反転)            +1(プラス1) ---------- 1111 1111(2)(答え) -127(10)      ==>0111 1111(2)  まず、正で表す。    「確認」        1000 0000(反転)           +1 (プラス1) ---------- 1000 0001(答え) ここからが疑問なんです。    -128(10)の場合      ==>1000 0000(2) まず、正で考える。    「確認」        0111 1111(反転) +1 (プラス1)       -----------      1000 0000(2)(答え) ↑ ・答えがプラスの128(10)=>10000000(2)と同じではない  でしょうか? ・このときの最上位ビットは桁上がりの「1」と正負の違  いを表す「1」のどちらを表しているのですか? ・たとえば「負数を2の補数で表すとき,8ビットで  表現できる整数の範囲は10進数でどれか。」など  の問題で答えが正の127は理解できるのですが、  負は「-128」ということがよくわかりません。 一応検索をしてみましたが、類似回答では理解できませんでした。よろしくお願いします。        

  • ビット演算で00000001と1の頭に0を付ける?

    https://www.grapecity.com/japan/powernews/column/clang/019/page02.htm ビット演算子 表1にCのビット演算子を掲げておきます。ビット演算とは言っても、扱う値はバイト単位などCの一般的な整数のデータ型です。ビット演算子は、それらの値をビット単位で計算します。 ビットシフト演算(<< >>)~2倍と1/2 例えばunsigned char型の1は、2進数では"00000001"という形のビット列(ビットパターン)になります。これを1桁左にずらす(シフトする)と"00000010"となります。ずらしてあふれた左端の0は消え、空いた右端には0が入ります。 "00000001"は10進数の「1」、"00000010"は10進数の「2」です。つまり、ビット列を左に1桁シフトすると値は2倍になるのです。 -----------------------------------------  以上ですが、C言語の、ビット演算の解説の抜粋です。ビット演算はまだ覚えたてですが、"00000001"整数1の頭にわざわざ、0を沢山 つける目的は何なのでしょうか!?  よろしくお願いします。

専門家に質問してみよう