最近自分に自信がもてないもわさんですこんにちわ
与えられた2進数値(nビット)に対して、そのビット数より1桁多く、最上位ビットが1、残りがすべて0であるような数値(n=8なら 100000000)から、元の数を引いた数が2の補数である。
「反転させて+1」しか覚えてなかったから、上の定義で「あるぇー?(・ε・)」とか一瞬困った。
もんだい:上記の定義と「全てのbitを反転させて+1」が等価であることを示しなさい (配点 0点)
-
-
- -
-
整数Aに対して"-A"なるものを足したときに、n bitsならそのn bits上の全てのbitが0になればよろしいので、どちらの「定義」も同じ意味、というだけの話か……。
反転して足すだけだと全てのbitが1のナニカが出来上がって、+1してあげると全部0になるので実質同じ、と。こういう導き方って、結果が同じになるだけであって「証明」と言っていいんだっけ。
あれー、初歩的なところも忘れてますよ私?
1の補数使ったコンピュータとか触れてないなー、とかバカなことを考えてたらそもそも「補数」の定義シランカッタ
N進法において、自然数 a 以上となる最小の N の冪乗 を M とする。
- M-a が 「N進法における a に対する N の補数」である。
- M-a-1 が 「N進法における a に対する (N-1) の補数」である。
つまり「反転させて+1」は生活の知恵であって「定義」じゃなかったのですねー。あぅあぅ
2進法じゃないコンピュータなんてシランがなー。DNAとかそこらへん引っ張り出してみますかー。ってDNAって記号4つだっけ、でも別に4進というわけじゃないよな。全然知らんけど。
四恐怖症:漢字文化圏において 4 は死を連想させることから、あらゆるものに4を用いることを嫌う社会的傾向。
私はインターネット恐怖症です
にしても頭の回転遅いなー。2の補数の求め方の等価性判定に1分くらいかかった気がする。このエントリ書くのに20分かかった気がする。
あ、完全に忘れてた。元はこちら
「正数なら何もしない」「負数ならbit反転 -(2^32-1) すなわち +1」で、生活の知恵が生きてるって話でしょうか。">>" で 1 が出てくると思い込んだ私は負け組。
まぁ、-O0でabs2の方が速いのは比較が入るabsから見ると多分当たり前っぽくて、O2だとgccが頑張っちゃうって話なんでしょうか。なんかどこかの黒い人曰くprintfをputsに変えちゃうgccなので「この分岐はabsだ、分岐消しちゃうぞー」みたいなことやってるんでしょうかね。アセンブリ読めないのでなんともいえないですが、正数ばっかりとか負数ばっかりだと予測分岐でabsも速くなったりしてますます混乱極まりない状況になったりするのかも。
ただただ、2の補数のためだけのために午前が潰れた(他のブログ消費とひぐらしムービー見るのを含む)