へっぽこびんぼう野郎のnewbie日記

けろけーろ(´・ω・`)! #vZkt8fc6J

2の補数と1の補数についての混同と混乱について

ノイマンが書いた本を読んでたら減算器の話について出てきて思い出した。

そういえば1の補数っていうのややこしいなと。なのでブログに書いておくことにした。

要求知識

最低限理解に必要な知識として

・ビット
・2進数、10進数
・コンピュータは電子回路で動いていることを知っている

などを要求しています。

突如出現! 1の補数!

2の補数 について説明されるとき、まず補数とはなんぞやという話から始まって、たいてい次のような話が出てくるように思う(読み飛ばしていいです)

補数というのは足すと繰り上がりが発生する数のことだ。
たとえば10進数のとき、3に対する10の補数は7である。4に対する10の補数は6だ。
3に対する9の補数は6だ。
2進数で考えてみよう。1に対する2の補数は1だ。1に1を足したら10になるからだ。0に対する2の補数は0だ。
1101に対する2の補数は0011だ。

なぜこんな補数という概念ができたかというと足し算を使って引き算ができるからだ。
どういうことだろう。1101に0011を足すと10000になるということはビットを反転させると引き算になるからだ。それに最近コタツがほしいと思っている。

1101のビットを反転すると0010になる。ここに1を足すと0011という数字が得られる。つまり10000-1101は、1101をビット反転してそこに1を足したものと同じというわけだ。
この1101のビットを反転してあと1を足せば繰り上がる数(この場合は0010)のことを1の補数という。

こんな感じでなんとなく煙に巻かれる。

ふつうの人類はこのように考える。

しかしそれにしても 1の補数 とはなんだろう。

補数は繰り上がる数 とか言ってたな。

足すと繰り上がりが発生する数? 1進数? 1進数の繰り上がり?

2の補数とは?

というふうに考えて頭がパンクしてしまうはめになる。

本には詳しく書かれておらず、突然「1の補数を使います」とさっきの意味の補数っぽい感じでババンと用語が出現し、あとは「ま、まあわかるよね」というような感じでスルーされている。

こうしてコンピュータは難しいと言われ初心者は死んでいった。

2の補数と1の補数についての驚きの事実

そして、おどろきの事実はこうだ。

2の補数は足すと繰り上がる数だけど、1の補数は足してもべつに繰り上がらない。

補数って言ってるけどおんなじ意味の補数ではない。

メロンパンとジャムパンにおけるパンの違いぐらい違うものだと思っていい。

(メロンパンとジャムパンのそれぞれのパンの部分は、パンはパンでも、全く同じ種類のパンではないという意味)

結局、2の補数と1の補数とは何か。

・足すと2^nになる数を2の補数と呼ぶ。
・足すと2^n-1になる数を1の補数と呼ぶ。

つまり2の補数から1を引くと1の補数になる。まじでそれだけである。

ナ、ナンダッテー!? ソレダケカァ!?

補数という言葉に疑問を持つと死ぬ。そういう罠だったのだ。

厳密には

2の補数 = 2進法における基数の補数(radix complement)
1の補数 = 2進法における減基数の補数(diminished radix complement)

という。

「俺らコンピュータの勉強やってるんだから2進数における減基数の補数って言うのだるいし、2進数なのは当たり前だし今後は1の補数って呼ぼうぜ」
「おっ、そうだな。100に対する1の補数は11!」

くらいに略された言葉だ。

それから「1の補数」は英語では ones' complement で、厳密には「1たちの補数(足すと全部1になるから)」であり、「2の補数」は two's complement だ。

one's complement ではないので注意!!!(でも one's complement って書く人の方が多いよ!おまえらふざけんなよ)

いったい、これによってどのくらいの人数の人が苦しみを味わったのだろうか。

ともかく、 2の補数と1の補数は、メロンパンとジャムパンくらい違う という気付きは大事だ。

ちなみに 6に対する10の補数は4 と言うべきところを 6の補数は4 というように間違って言う人もいる。適当なことを言うんじゃねえ。

補数の重要性

それでまあ、この二種類の補数という概念がだいじなのは「足し算を使って引き算したいから」という欲求があったからだ。

その昔、初期の頃、人類は電子回路では足し算しかできなかった。足し算しかできないように作っていたので、足し算しかできなかった。

そこで頭のいい人が「足し算使って引き算すればいいじゃん」と考えた。

これはすごいことだ。足し算しかできなかったら、ふつうの人間は「足し算しかできねえのかよ」と言いつつも、足し算にしか使わないし、もしかしたら「コンピュータとかいうの使うより人間が計算した方が早いじゃん。科学者はバカ」とか言い出すものだ。

なのでこれは「仕事ができないやつを組み合わせて仕事が回るようにする」くらいの発想だ。

それで、まあそういう寓話は置いといて、その人は引き算もしたがっていた。

そもそも引き算というのは何をしているのか。

2進数だと 1 + 1 = 10 だから 10 - 1 = 1 で、 10 + 1 = 11 だから 11 - 10 = 1 だ。足し算の逆のことをしている。

ところでコンピュータを作るために色んな論理回路が必要になる。論理回路にはNOT回路とかいうものがあって、これはビットを反対にするものだ。これを使って引き算が作れる。

01 のビットを反転させると 10 になる。反転させたあと1を足して、

10 - 110 + 10 + 1 のように書き換えてしまう。

そして 101 という答えが出るけど、3桁目の1は消して 01 というふうになる。

こうすると 10 - 1 = 1 ができたことになる。なぜか。

10 - 110 + (11 - 1) + 1 - 100 と等価だからだ。ビット反転という操作は 11 - 1 という部分に相当する。そして3桁目を脱落させた操作は、 -100 に相当する。

このようにして m - ncutOverflowedOne(m + invert(n) + 1) と等価というふうにできる。

そんなかんじです。いやあ補数って便利だなあ。

なんか煙に巻いてる気がするけど、このビット反転(invert)が要は1の補数を求めてる箇所です。そのあと1の補数に +1 して 2の補数を求めてます。

トランジスタでも買ってきて減算器を作ればすごいわかるようになると思います。

そのうちつくったら追記します。

音圧について、dBが変わると音の大きさがどのくらい変わるか早見表作ってみた

例: 48dBの洗濯機の脱水音と42dBの洗濯機の脱水音は、差が6dBなので、2倍音の大きさが違う

(=42dBの洗濯機を2つ並べて脱水すると48dBの洗濯機の脱水の音と同じ大きさになる)

簡易版

dB 比率
+20 10倍
+15 6倍
+10 3倍
+6 2倍
+3 1.4倍
+2 1.25倍
+1 1.1倍
0 1倍
-1 90%
-2 80%
-3 70%
-6 50%
-10 30%
-15 20%
-20 10%

詳細版

dB 比率 近似値
+20 10倍 10
+19 9倍 8.912509381
+18 8倍 7.943282347
+17 7倍 7.079457844
+16 6倍 6.309573445
+15 5.6倍 5.623413252
+14 5倍 5.011872336
+13 4.5倍 4.466835922
+12 4倍 3.981071706
+11 3.5倍 3.548133892
+10 3倍 3.16227766
+9 2.8倍 2.818382931
+8 2.5倍 2.511886432
+7 2.2倍 2.238721139
+6 2倍 1.995262315
+5 1.8倍 1.77827941
+4 1.6倍 1.584893192
+3 1.4倍 1.412537545
+2 1.25倍 1.258925412
+1 1.1倍 1.122018454
0 1倍 1
-1 90% 0.8912509381
-2 80% 0.7943282347
-3 70% 0.7079457844
-4 60% 0.6309573445
-5 56% 0.5623413252
-6 50% 0.5011872336
-7 45% 0.4466835922
-8 40% 0.3981071706
-9 35% 0.3548133892
-10 30% 0.316227766
-11 28% 0.2818382931
-12 25% 0.2511886432
-13 22% 0.2238721139
-14 20% 0.1995262315
-15 18% 0.177827941
-16 15% 0.1584893192
-17 14% 0.1412537545
-18 13% 0.1258925412
-19 11% 0.1122018454
-20 10% 0.1

おまけ

計算方法は 10^(【dBの差】/20) による。

比率は概数。なるべくキリのいい数字にしようとしているので恣意的。

簡易版は、さらに覚えやすい数字にしてあるのでなるべく正確に把握したい場合は詳細版をおすすめしたい。

Linuxのターミナル(コマンドライン)でプロセスが「強制終了」とだけ出て応答しなくなった場合

英語の場合のメッセージは Killed

stackoverflow.com

OutOfMemoryエラーっぽいので、 /var/log/messages を見るとしあわせになれる

🈫 𝖀𝖓𝖎𝖈𝖔𝖉𝖊をつかって𝐼𝑡𝑎𝑙𝑖𝑐とか𝐁𝐨𝐥𝐝とかをどこでもつかえるようにするための𝘚𝘤𝘳𝘪𝘱𝘵つくった

使い心地

Twitter

f:id:haruharu1:20190107192055p:plain

Lineで

f:id:haruharu1:20190107192111p:plain

ここで使えます

https://rawcdn.githack.com/harukaeru/unicode_htmllike/216a8d4706528ce4df847ea1562be542a19b106d/index.html

使い方

f:id:haruharu1:20190107193254p:plain

HTMLのタグのように書きます。Unicodeにある文字にただ変換してるだけなので、魔法的なこと(タグを組み合わせてすごい文字を作るとか)はできません。

使えるタグや文字はデフォルトで表示してあるタグや文字のみです。他のが欲しい場合はGithubでIssueをたてるとそのうち実装するかもしれません。

豆腐で表示されている文字は、あなたが使っているブラウザやOSでサポートしていません。豆腐が含まれている文字種は使うのを控えることを推奨します。

Display letters one by one のチェックを外すと、一般的な表示になります。基本的にコピペして貼り付けるとこの表示になります。

色とかはつけれません。そういうものではないです。

Unicodeに対応してないアプリなどでは使えません。

ソース

unicode_htmllike/index.html at master · harukaeru/unicode_htmllike · GitHub

PRお待ちしてます(`・ω・´)

関連する記事

ㇹ゚ン゚'ㇳ̃ヴ゙ニ゙コ゚ヮヰ文̂字̠コ゚−ト゚ノ゙ㇵナ゚ㇱ(現在に至るまでの文字コードの軌跡と簡単な使い方について) - へっぽこびんぼう野郎のnewbie日記

追記

I getI got でした

MySQLのクエリsをプロファイリングしたいときにすること

一応 Deprecated なので、 perfomance_schema の方でやるほうがいいらしいけど、やり方がパッと見つからなかったのでとりあえず

リファレンス

MySQL :: MySQL 8.0 Reference Manual :: 13.7.6.31 SHOW PROFILES Syntax

MySQL :: MySQL 5.6 Reference Manual :: 5.1.7 Server System Variables

再現性のあるスロークエリーには「SHOW PROFILE」を試してみよう | Think IT(シンクイット)

コード

SET PROFILING = 1;
SET profiling_history_size = 100;

【調べたいクエリたち】

SHOW PROFILES;

profiling_history_size は 好きに変更してください。

戦争するのはなぜよくないのかと、平和について(サイコパス編)

戦争!だめ!

「戦争は良くない」ということを人に訴えるとき

「ひどいからだめだ」
「良くないのでだめ」
「戦争はいいって言うなんて頭がおかしい」
「命は大切だから」

みたいな感情メイン・倫理的な面から語られてることが多いと思う。

そうではなく自然に「ダメ!」と思ってる人に聞いても

「なんとなくよくないと思う」
「倫理的によくないと思う」
「グロいからよくないと思う」
「大変だからよくないと思う」
「困るからよくないと思う」

というふわふわした答えが返ってくる。

そこで倫理を排除してみた。

戦争とあなた

戦争は人が死ぬ

戦争は人がたくさん死ぬ。

でも大多数の人は「別に自分に関係ない人がたくさん死のうが知ったこっちゃない」と思っている。それはわかる。

「ルワンダ虐殺?ポルポト?なにそれ初めて聞いた」
「『近くで火事があって10人死んだんだって』『へー、こわいね』」

という人たちがいくらでもいる。それほど関心がないものである。

問題は自分が死ぬか否か、自分に近しい誰かが死ぬか否かである。戦争をすると自分は死ぬのか?

ここが大事だ。

第二次世界大戦では、日本は人口が約7000万人いて、そのうち約300万人が死亡した。

簡単にいうと20人に1人が死んだ。

「20人に1人」というと「なんとなく自分ではないと思うけど選ばれた人は可哀想だな」という気がしてくるが、かかっているのは命である。

これは

1. 国民全員に無理矢理宝くじを1枚ずつ買わせる
2. 300円があたった人にだけ、コインを投げさせる
3. 表が出たら死。

ぐらいの割合である。

人間ポジティブなものだと20人に1人でも「自分かも!」と思うくせに、ネガティブなものだと「自分じゃないだろう」と思うのである。

これは死者数だけなので傷病者数などは含まれていない。

怪我というのは「転んだ!怪我した!」とかじゃなくて「撃たれた!足が腐って切らざるを得なくなった!」とかいうやつだ。

なのでさっきのたとえで言うならば、当たらなかった人の中から抽選で重症や重病を負う。

「死んだのは男や軍人がほとんどだろ」という声もありそうだけど「死なない=いつも通りの生活をおくれる」ということでもない。とにかく自分が死ぬ確率を上昇させることだけは確かである。

少なくともぼくは好き好んでそんなことはしたくない。

「戦争は、たくさん人が死ぬ」というのは「戦争は、ぼくが死ぬ可能性をかなりあげる」ということである。

そして、死ぬかもしれない代わりにリッチな生活をおくれるようになるだろうか?

幸運にも死ななかったとしても、もれなく次の負担がのしかかる。

戦争のためにいっぱい働かなければならない

戦争というものは敵国とやるものだ。戦争をするにはいい武器がたくさん必要である。そういうわけで敵国は一生懸命頑張って武器を開発し資源を消費してこちらに攻撃をしかけてくる。

そのためにこちらもいつもより熱心に働かなければいけない。相手が強ければ強いほど一生懸命働かないといけない。

定時あがりなどもってのほかである。成果は無限に要求される。家に帰ってYouTubeが見れるかどうかも不明である。なんという生活だろうか。そもそもネットは自由に使えるのだろうか。

海上封鎖されたり輸送船が攻撃されて輸入品が入らなくなったら、ろくに飯も食えない。魚が高騰し食えなくなる。ガソリン代は高い。バスの運賃はあがる。Amazonで好きなものも買えない。なんという生活だろうか。

第一、戦時ではそんなものを輸入するより武器や材料を輸入したほうがいいのだ。だから基本的に全部値上がりする。税金がかなり上がるようなもんである。

いままでダイエットできなかった人もダイエットできるのが唯一の利点とはいえ、衣食住の衣食がかなり微妙なものになる。

戦線を日本国土でたとえる

戦線という言葉を聞いたことのある人も多いと思う。ただし具体的にイメージできている人は少ないとも思っている。以下の文章は想像力を働かせて読んでほしい。

戦線というのはたとえば、富山県から愛知県まで線を引いて「西部戦線」のように呼ぶ。この線上にずーーーっと軍隊が並んでいる。

マジか?と思われるかもしれないがこれがマジなのである。

富山県富山市、岐阜県飛騨市、岐阜県高山市、岐阜県下呂市、岐阜県可児市、愛知県犬山市、愛知県小牧市、愛知県名古屋市、愛知県東海市、愛知県知多市、愛知県常滑市

に軍隊が駐留し、これらの西にある市街および街道で戦争することになる。

攻め込む敵国は石川県から三重県まで線を引いて「東部戦線」と敵国では呼んでいる。もちろんこの線上にずーーっと軍隊が並んでいる。

石川県加賀市、福井県あわら市、福井県坂井市、福井県福井市、福井県鯖江市、福井県越前市、福井県敦賀市、滋賀県長浜市、滋賀県米原市、滋賀県彦根市、滋賀県東近江市、滋賀県甲賀市、三重県伊賀市、三重県名張市、三重県尾鷲市

に駐留し、この2つの戦線の間で戦闘が勃発することとなる。

つまり戦場は市単位でいうなら

石川県小松市、石川県白山市、石川県能美市、石川県野々市市、石川県金沢市、石川県かほく市、石川県羽咋市、富山県氷見市、富山県小矢部市、富山県高岡市、富山県射水市、富山県砺波市、富山県南砺市、福井県勝山市、福井県大野市、岐阜県郡上市、岐阜県美濃市、岐阜県美濃加茂市、岐阜県岐阜市、岐阜県本巣市、岐阜県大垣市、岐阜県羽島市、岐阜県海津市、愛知県江南市、愛知県一宮市、愛知県あま市、愛知県愛西市、愛知県弥富市、三重県桑名市、三重県四日市市、三重県いなべ市、三重県鈴鹿市、三重県亀山市、三重県津市、三重県松阪市、三重県鳥羽市、三重県志摩市

となる。これらの市街地や道路は爆破される運命にある。

f:id:haruharu1:20181222192456p:plain

ちなみに言うまでもないが、この場合、西日本は敵国に占領されており、支配下である。つまり平たくいうと上の状況をすでに経験済みである。

2つの戦線は、自分の戦線を前進させることを目的としている。なので占領されてない地域も全く他人事ではない。

たとえば、相手の戦線の石川県加賀市の部分を京都府舞鶴市まで押し込めれば勝利であるし、こちらの戦線の愛知県名古屋市の部分を静岡県浜松市まで後退させられれば敗北である。

民間人は全員東日本に集まってないないづくしの中で必死に働いて軍隊へいろんな物資を渡さなければいけない。

毎日出社してひいこら働いて完成したものは、前線(西部戦線)へと送られて消費される。そうしてまた新しい一日がやってくるのである。

西日本の民間人はもう占領されているので知る由もない。収容所おつである。

そして、これらは一部の戦線の話であって、本当はもっとたくさんある。具体的には秋田県山形県青森県や北海道も、向こう側から来る敵機対策をしなければならない。

こんな中「家でYouTube」など、はっきり言うとスパイみたいなもんであって、非国民と呼ばれてリンチされてもしかたのないことである。

実際はこういう戦線を進めたり戻ったりというようなことを世界の様々な地域でやっていたので、今話したものよりもはるかに規模は大きい。

日本国土は小さいので、世界的に見れば「ずいぶん規模が小さい戦線だな」という話でもある。本土の話をしたのはあくまでイメージしやすいようになので、これぐらいの規模で「広いな」と思ってはいけない。

富山市から常滑市までの距離は300kmもないが、実際の戦線では800kmや900kmというのはざらにあった。これは大体東京から広島まで、東京から青森までの距離だ。

なので、戦争のためにいろいろと頑張るというのは現実的に見て完全に馬鹿げた話である。明らかに労力がもったいなさすぎる。

被害的に言うとすごい勢いの台風が毎日連続で来て、たまに巨大地震が来るようなもんである。

特筆すべきところは、これを人力で起こしているということである。バカか。

なので「韓国と戦争する」とか叫んでる人はこういうことも想定するべきである。

「戦争しても日本本土が攻め込まれない可能性がある」のと「戦争しないから日本本土は攻め込まれない」のでは後者の方がいいに決まっている。

遠方での小規模の戦争について

敵国が小規模だろうが、政府の財源を削るという点でNoである。それが利益となりえない限りやるものではない。基本的には利益とはならない。アメリカを見てもそれは明白である。

平和のためにできること

「平和」という言葉はバカっぽく聞こえる。麻雀のピンフと漢字が同じなので茶化す人もいる。平和平和と言っている人があまりにも感情的すぎるように見えてしまうというのもある。

平和とは戦争してない状態である

・敵が攻撃せず、こちらも攻撃しないなら平和である。あたりまえだ。
・敵が攻撃してきて、こちらは攻撃しないならただ虐殺される。よくない。
・敵が攻撃せず、こちらは攻撃するなら敵国の全部の資産を奪えていっぱい儲かる。おいしい。
・敵が攻撃してきて、こちらも攻撃する。戦争。上で挙げたようにいいことがない。

なので基本的には、敵が攻撃してこなければずっと平和を保てるのである。あたりまえだ。

つまり、敵に攻撃させないようにするのが平和のための国家戦略である。それでも攻撃してくるなら攻撃せざるを得ない。

これに関するいろいろ国家戦略があるけど代表的なものは次の2つ。

「おまえはもう二度と立ち上がれなくしてやる」方式

二度と立ち上がれなくして富を吸い上げる。

こうすると不満が爆発して二度と立ち上がれないはずだったのに意外にも歯向かってくる。いわゆる第二次世界大戦の原因である。なので良くない。

「君が戦争すると損だよ。戦争しないなら助けるよ。あまりにも無茶苦茶なら滅ぼすよ」方式

現在世界各国がとっている体制である。政府開発援助などをして国際協調主義をとっている根本的な原因である。

「おまえが困りすぎてうちに攻め込んでくると怖いし先にお金渡すわ。攻めてきたらお金あげない」という感じである。

これは結構うまくいっている。

ひとりひとりは平和のために何ができるか

日本は現在、他国へ積極的に攻め込もうとしていないので「他の国家がこちらに攻撃してこない」というのを促進させることが肝要である。

強い影響力を及ぼせるのは、自分が政治家になったり活動家となったり国連に入るなりある。

一般人が平和のためにできることは、海外への募金だったり、外国人に親切にしたり、こうした思想を他者に啓蒙することである。

こうした行動はあまりにも他己的すぎて、自己の利益に著しく反する。直接的な利益が得られない。

しかも思いやるばかりではなく、知識や力もなければならない。募金したと言っても結局マフィアの資金になった場合は元も子もない。

そういう意味で、平和というのはとてもむずかしい。

とにかくまぁ「戦争はよくない」ということである。

そして、「戦争はよくない」というのは倫理的な面以外にも、こうした実利的な面でも十分語られるべきであると思う。