初めに
この文章を読むにはn進数の基礎知識が必要です。 内容の転載・改変・再配布を禁止します。 内容に関しての質問や、誤字脱字の報告はs2019188@asano.ed.jpまでお願いします。 筆者は淡泊なので文章が味気ないですが、それでもよろしければお楽しみ下さい。
負のn進数
私の知る限り、一般に基数は自然数であるとされています。 しかし基数が自然数でなくても大丈夫です。 というわけで今回は-2進数を紹介します。
四則演算
四則演算は、繰り上がりなどの演算法則が分かればOKです。 足し算…1+1=110で、1つ上の位に1があったら打ち消す。 \[ (-2)^n+(-2)^n=(-2)^{n+1}*(-1)=(-2)^{n+1}(-2+1)=(-2)^{n+2}+(-2)^{n+1} \] 引き算…0-1=11が分かれば他の計算もできると思います。 \[ 0-(-2)^{n}=(-2)^{n}(-2+1)=(-2)^{n+1}+(-2)^{n} \] -1をかけて足す、というのも可能です。(面倒ですが) 掛け算… 途中まで2進数と同じように計算して、足すときだけ上記の手法を使う。 割り算… まだ理解できてないので、説明できません。 宿題ということにします。
2進数を-2進数にする
けっこう面白そうですよね。 10進数に直してから-2進数にするのはつまらないので、直に変換します。 人によって考え方が違うと思いますが、私のやり方を書きます。 2進数のある桁は、-2進数に変換出来ます。 偶数乗の桁はそのままです。 奇数乗はその位と1つ上の位に足せばいいです。(上の引き算と同じ) あとは足し算するだけです。 これならプログラムにもできますね。 (プログラムではこんな無駄で複雑なことしませんが)
10進数を変換する
生きていると、10進数を他の記数法にすることがよくあります。 整数なら簡単ですが、小数だと同様には計算できません。 そんな時はこんな風に計算をします。 例:1.2を2進数にする \[ (\frac{1}{4})^{n}の位の数をa_nとする(n:非負整数,0 \leq a_n <4,a_n \in Z)\] \[ 1.2=a_0+a_1*(\frac{1}{4})^{1}+a_2*(\frac{1}{4})^{2}... \] \[ a_1以降の和は0以上1未満だからa_0=1\] \[ 両辺からa_0=1を引き、2をかけて\] \[ 0.4=a_1+a_2*(\frac{1}{4})^{1}...\] \[ a_1=0\] \[ ...... \] 循環するため、1.2=1.\dot001\dot1 \[ で、ここまでならある程度数学を学んでいる方は知ってると思うんですけど-2進数で同じことをやろうとすると出来ないんですね。 例:0.8を-2進数にする \] (\frac{1}{-2})^{n}の位の数をa_nとする(n:非負整数,0 \leq a_n <|-2|,a_n \in Z)\[ \] 0.8=a_0+a_1*(\frac{1}{-2})^{1}+a_2*(\frac{1}{-2})^{2}… \[ \]a_0=0\[ \]両辺からa_0=0を引き、-2をかけて\[ \]-1.6=a_1+a_2*(\frac{1}{4})^{1}…\[ \]a_1=….-1?\[ \]…… \[
はい、謎ですね。 仕方なく0にしても、次は3.2になっちゃいます。 じゃあ、-2進数では表せないのかというとそうではなくてちゃんとやれば表せます。 では、どこがいけなかったのでしょうか。 怪しいのは\(a_0=0\)ですね。 2進数では\(a_1\)以降の和が0以上1未満だから1には出来ませんが、-2進数では負の値をとります。 だから、10進数で1の位が0でも\(a_0\)=-1になる可能性があるんですね。 では、どうやって0か1かを判断するのでしょうか。 \(a_0\)が0の時、1の時の境目を考えればいいですね。 0の時の最大値は\(0.\dot0\dot1=\frac{1}{4}*\frac{1}{1-\frac{1}{4}}=\frac{1}{3}\) 1の時の最小値は\(1.\dot1\dot0=\frac{1}{3}\) なので、\(\frac{1}{3}\)が境目だと分かります。 これ以下は0、これ以上は1にすれば、-2進数でも小数が表せます。 というわけで、-2進数の紹介でした。 -2以外の基数にもできるので、暇な方は自分で考えてみて下さい。
1進数について
n進数の定義を考えると、1進数というものは存在しません。 1で位が上がってしまうので、0以外の数を表せないからです。 ですが、世の中には1進数と言えるものがあるそうです。 それが画線法です。 日本においては正の字が主流のアレですね。 得点や得票数、何かの回数を数え記録するのに便利です。 正の字、いいですよね。私も普段からお世話になってます。 常日頃から正の字を目にする人もいるでしょう。 個人的にはこれを1進数と言いたくないですが、 言ってることは分からなくもないので紹介しました。 余談ですが、1進数では0はε(イプシロン)で表すらしいです。
n進化m進数
数の各桁を、他の記数法で表された数で書く記数法です。 例えば、2進化10進数では10進数の1つの桁(0~9)を 4桁の2進数の一部(0000~1001)で表します。 例:69⇒01101001 慣れ親しんだ記数法の感覚で数が扱えるので、n進数が苦手な人でも使えます。 あと、2進化3進化8進数とかいうものも作れます。 ただの2進数に比べて効率が50%低下するので、実用性はありません。 暗号にでも使いましょう。
おわりに
以上が現時点での私の知識です。 ニッチな内容なので、お友達との会話のネタにでも使ってください。 もっと詳しい話が聞きたい、もっと高度な内容を知っている、という方ははじめに載せたメールアドレスにお願いします。 読んでいただきありがとうございました。