A 回答 (8件)
- 最新から表示
- 回答順に表示
No.8
- 回答日時:
>最上位ビットの符号ビットはそのままというのはわかるのですが、そのすぐ下位のビットで符号ビットと同じものを補充する・・・のつもりで書いていたのです。
4ビットの各桁をABCDとすると、
・ABCDを右にシフトすると ?ABC になる。
・?の部分は シフトする前の値の同じ場所にあった桁をそのままもってくるので AABC になる。
ですから「そのすぐ下位のビットで符号ビットと同じものを補充する」わけではありません。
A B C D 元の数値
|\\ \
A A B C シフト1回目
|\\ \
A A A B シフト2回目
|\\ \
A A A A シフト3回目
↑この図は当幅フォントで見てください。
No.7
- 回答日時:
>右シフトの場合で最上位の符号ビットと同じものを空いた上位ビットに補充というのが未だに理由がイマイチわからないです。
符号を保存するためです。
右シフトをしたとき最上位ビットに入れる数の候補は
・0を入れる。
・1を入れる。
・符号ビットと同じものを入れる
の3つがありますが、それぞれについて比較すると分かります。
4ビットで解説します。
例 0100(10進で4)の場合
・0を入れる 0010 (10進で2)
・1を入れる 1010(10進で-6)
・符号ビットと同じものを入れる 0010 (10進で2)
例 1100(10進で-4)の場合
・0を入れる 0110 (10進で6)
・1を入れる 1110(10進で-2)
・符号ビットと同じものを入れる 1110 (10進で-2)
つまり、正の数でも負の数でも「右シフトすると1/2」になるという理屈に合うのは、
「符号ビットと同じものをいれる」
ときだけなのです。
この回答への補足
すいません。表現マズかったです。
最上位ビットの符号ビットはそのままというのはわかるのですが、そのすぐ下位のビットで符号ビットと同じものを補充する・・・のつもりで書いていたのです。
No.6
- 回答日時:
>右シフトの場合で最上位の符号ビットと同じものを空いた上位ビットに補充というのが
#1の対応表を見て下さい。
最上位ビットがあるものをマイナスとして表現しているのがわかるでしょう。
丁度符号付きの数値として、考えた場合でも(1算術右シフトは、値を半分にする)値が半分になっていることがわかると思います。
もし、符号ビットがシフトによって補充されない(論理シフト)なら、マイナスの表現として破綻してしまいます。(割った結果が正になるから)このことも、#1の対応表をみればよくわかると思います。
No.5
- 回答日時:
数字の右端に小数点があると考えるとわかりやすいと思います。
10進数では左にシフトすると10倍、右にシフトすると1/10となるのと同じで、
2進数では左にシフトすると2倍、右にシフトすると1/2となります。
10進で5の例
05.00を、左シフトすると50.00(=10倍)、
右シフトすると00.50(=1/10)
2進で0101の例
0101.0000を、左シフトすると1010.0000(=2倍)、
右シフトすると0010.1000(=1/2)
つまり、n進数で表した数値は、左シフトでn倍、右シフトで1/nになります。
但し、2進数では
1 算術右シフトと論理右シフトでは結果が違う。
2 負の数を補数で表現するため、右シフトでは最上位ビットを保存する必要がある。
3 少数は別の形式(浮動小数形式)で表現するため、小数点より右側はカットする。
という違いがあります。
この回答への補足
左シフトについては理解しました。
右シフトの場合で最上位の符号ビットと同じものを空いた上位ビットに補充というのが未だに理由がイマイチわからないです。
自分でも考えてはいますがナカナカこれだ!って理由が出てこないです。こういうもんだと思って覚えろと言えばそれまでかもしれないですが・・・
No.4
- 回答日時:
C言語で、左シフトで算術シフトと論理シフトが区別がないのは、
1シフトが2倍になるという意味(つまり算術シフト)の時、
シフトの結果が、表現できる範囲の時、
(表現できない場合は、桁あふれしているので、意味がない)
(論理シフトと)同じ結果になるためです。
例えば、16ビットの時
-32768~32767の範囲で結果が収まる時、正しい結果になるということですね。
言われてみれば確かにそうですね。表現できない範囲にシフトするとどちらも論理/算術で壊れ方は違っても意味が無くなるということですね。
わからない(気がつかなかった)とこが1つ減ってすっきりしました。
No.3
- 回答日時:
シフト演算には、論理シフトと算術シフトがあります。
算術シフトでは符号ビットが保持されますので、負数をシフトした場合両者の値が変わってきます。どうして成り立つかと聞かれてもそういうきまりなので答えようがありません。ちなみに、C言語で書く場合、signed型を右シフト(>>)すると算術シフト、unsigned型を右シフトすると論理シフトになります。左シフト(<<)は論理シフトです。算術シフトしたければ符号ビットを保持しておいてor(|)するか、インラインアセンブラを使います。(僕が知らないだけかもしれません。算術左シフトの書き方があったら教えて欲しいです。)
この回答への補足
基本情報の対策テキストを見て勉強していたのですがCには算術左シフト無いんですか。。
情報系のカテゴリの中でC言語の場合応用分野が広い分こういうこと説明できる人も多いかなと思ってこのカテゴリに投稿させて頂きました。不適切だったでしょうかね・・・
No.1
- 回答日時:
例えば、仮に、4ビットで考えてみると最上位ビットを符号ビットとして考えると
1111→-1
1110→-2
1101→-3
1100→-4
1011→-5
1010→-6
1001→-7
1000→-8
0111→7
0110→6
0101→5
0100→4
0011→3
0010→2
0001→1
0000→0
だとすると、
-8を1算術右シフトすると-4になりますよね。
これは、左シフトが2倍右シフトが1/2倍ということに合いますよね。
あふれたビットを破棄するのは、その範囲で表現できないから切り捨てる
たとえば
3を2で割ると1.5ですが、
1右シフトすると1になりますが、
0.5を保持する桁がないからですね。
逆に桁あふれも同じ意味ですね。
具体的な例ありがとうございます。
やはり溢れたビットを破棄と言っても意味のあるビットが上位に含まれるときはダメなんですね。左シフトの場合は理解できました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 情報処理技術者・Microsoft認定資格 2進数の問題を教えてください。 1 2022/07/27 09:42
- Excel(エクセル) 月間シフト表から総勤務時間を計算する関数 4 2023/05/20 07:12
- アルバイト・パート 高校生です。 初バイトのシフトをシフト希望の紙を渡された日にその場で書いたのですが、圧などもあり焦っ 5 2022/07/21 00:40
- 会社・職場 バイト先が信用できません 4 2022/05/10 11:50
- 財務・会計・経理 決算のやり方、税務申告書の書き方、おすすめ本 4 2022/06/18 22:45
- アルバイト・パート 友人のバイト先について アルバイトのシフトについてです。高校生です。 出勤出来る人がほぼおらず、人手 2 2022/12/13 23:35
- 飲食業・宿泊業・レジャー バイトのシフトについて 私はある24時間営業の飲食店で働いているのですが、シフト希望表に毎週同じ曜日 2 2022/10/13 21:32
- アルバイト・パート スシローのバイト 4 2022/06/07 00:47
- 会社・職場 アルバイトのシフトについてです。 学生なのですが、アルバイトで今までよくオープンのシフトに入っていま 2 2022/07/17 14:46
- アルバイト・パート バイト辞めたいです。現在高校生で長期アルバイトをしています高校卒業するまでの約束です。でもシフト希望 4 2022/11/22 17:23
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#でTreeViewのCheckBoxのサイ...
-
どうして+3
-
逆コンパイルと逆アセンブルの...
-
C#でゲームのチートを作ること...
-
あんまり考えたくないけど
-
C#でログファイルにファイルパ...
-
gccを行ってもexeファイルが生...
-
MACで動く実行ファイルをWindow...
-
【C言語】全角文字の配列を、全...
-
プログラミングc++を全く分か...
-
あってる
-
DNCL(共テ用プログラミング言語...
-
DNCL(共テ用プログラミング言語...
-
C# で 数式文字列処理を処理す...
-
C言語のことです。写真(見にく...
-
Cのプログラムからアクセスでき...
-
プログラミング言語でアプリや...
-
c++の勉強方法を教えてくださ...
-
パソコン
-
今ってプログラミング言語は何...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
ビットシフトってどんな時使うの?
-
エクセルVBAのIf,Then 構...
-
命令について
-
文字参照は10進数と16進数では...
-
C言語で128bitの2進数のビット...
-
03分22秒36のような時間の単位...
-
シーケンス制御についての質問...
-
verilog 符号付加減算(最上位...
-
算術シフト演算が成り立つ理由...
-
C言語やC++言語でビット毎に値...
-
一般のソフトで画像を扱う場合...
-
ビットの取り出し方法
-
Python: 数値を反転させたい
-
上位ビットと下位ビットの入れかえ
-
MIPSアセンブラの問題です。
-
3進数を10進数に変換
-
16ビットCPUで32ビットの計算方法
-
スロースキャンコンピュータ 加...
おすすめ情報