はてなキーワード: 進数とは
一日経って埋もれた頃だしそろそろ平気かな。
「えきにしく゛ちよこのかふえにいる」
メールは最初の一人だったらめんどいから送らなかった。というか捨てアドの名前考えるのがめんどいから送る気なかった。増田にトラバでいいじゃんと思った。さすがに出てすぐ解答書くのはちょっちゅねーとか思って待った。そして今ここに書いた。といういきさつ。
ところで、最近こういう十六進数字みたいな文字の羅列をとある個人サイトの掲示板でも見かけたんだけど、流行ってるのかなこれ。
掲示板の方で見た時は興味なくてさらりと流してた。あと今ログ見に行ったらもう流れてたから、言うほど最近じゃないかもしれない。
夢のない発言をするなあ。こういうときは嘘でも14歳としておくのがおれたちのルールじゃないの?
とりあえず、君の年齢は22進数で14歳ということでよろしくな。
あと、「僕」じゃなくて『ボク』な。ここ結構重要だぜ。
ぼく「えっ」
PHP「$a="0x0A";++$aは11になりますが」
ぼく「いえ"0x0B"です」
PHP「えっ」
ぼく「えっ」
PHP「まだインクリメントしたことがないということでしょうか」
ぼく「えっ」
PHP「えっ」
ぼく「変化するってことですか」
PHP「なにがですか」
ぼく「型が」
PHP「ああ文字列でも整数っぽい文字列なら自動で型変換されますよ」
ぼく「そうなんだすごい」
PHP「ではインクリメントいたしましょうか11ですよ」
ぼく「でも"0x0A"は明示的にキャストしたら0になりますよね」
PHP「えっ」
ぼく「えっ」
PHP「ああ16進数のことなら10進数に自動で変換してから演算するんですよ」
ぼく「なにそれこわい」
PHP「for($i="0w9Z";$i<12;$i++){echo $i;}と書くと $i="0w9Z", "0x0A", 11と変化します」
ぼく「なにそれきもちわるい」
PHP「えっ」
ぼく「えっ」
String型同士の比較であっても整数と解釈される文字列の場合は整数に変換される。
この仕様は知っていたが、まさか0x0Aという文字列が、普通にキャストした場合は0にしかならないのに、==演算子による自動変換の場合には16進数と解釈されて10に変換されるという新しい発見(元増田的に)を面白おかしく書いたのが元記事。どちらかというとPHPerに向けたネタ記事なので===演算子に触れちゃうと面白さが半減しそうだよね。
あと、他の言語の規則って何のこと?
もちつけ。
===演算子を使うなとは書いてないし、8進数使いたいとも書いてない。
そして誰も「つのだ★ひろ」には突っ込まないw
012とかは、よく桁のパディングで 000001 と 1が同じであることを見つけるとかって処理をするから、8進数と見なしてくれるより、10進数で0詰めって見なしてくれた方が、テキスト処理言語としては、そっちのほうが便利だと思った。
自分にとって問題だって考えるよりも前に、何かの必要性があってそうなってるんじゃないか?って仕様を見つめる目がないと、自分よりも経験が長いプログラマが理由があってそう書いている物を、無知からダメなほうに改造しちゃうことがあるので・・・どうかなーって最近よく思ってるので追記
===演算子を使えよ
if ("0x0A" === "10") {
print '(´ε` )チュッ';
}else{
print '\(^o^)/';
}
==演算子は方をキャストしながら、ほぼ同じなら同じと見なせという意味。
HTMLとかで曖昧に比較したいというのがベースな言語なのに何を言う・・・
厳密に比較して欲しいときは、型キャストを明示的に禁止する===を使えば良いのに、何が不満なんだろう。
if ("0x0A" === "0x0A") {
print '(´ε` )チュッ';
}else{
print '\(^o^)/';
}
(´ε` )チュッ
8進数使いたいという場合がよくわからないけど、それが必用なら、必用になった人がコードにパッチを当てて
試験して、それを、PHPの開発チームに送りつけてコミットさせれば、次のバージョンからサポートされるでしょ。
オープンソースなんだから、必用になった人が機能を追加する。これ基本。
if ("0x0A" == "10") {
print '(´ε` )チュッ';
}
チュッ。されちゃいます。
文字列であっても整数と解釈できる文字列の場合は勝手に型変換しやがる今世紀最大の愚行を犯してしまうってのは有名な話だよね。
文字列であっても整数と解釈できる文字列の場合は自動的に整数に型変換してくれる超便利機能があるってのは有名な話だよね。
だけどなんでコレが一致するかわけがわからんかった。
0x0Aは10進数で10になるので一致する。と、言いたいところなんですがそう単純な話じゃないんだ。
以下の例を目ん玉見開いて見て欲しい。
var_dump(0x0A);
var_dump("0x0A");
var_dump((int)"0x0A");
var_dump((float)"0x0A");
var_dump(intval("0x0A"));
実行結果
int(10)
string(4) "0x0A"
int(0)
float(0)
int(0)
つまり文字列の"0x0A"ってやつはどう考えても0と解釈されるはずなんだ。だから上記if文が本来一致するはずがいない。
でも実際は何故か10と解釈されて一致してしまう。
そう、つまり演算子で比較した場合、やらんでもいいのにわざわざ16進表記かどうかまでチェックして余計なお世話的うんこ変換しやがるということになる。
そう、つまり演算子で比較した場合は、16進表記かどうかまでチェックして10進数に変換してくれているということになる。
明示的に書くならこんな感じだ。
if (intval("0x0A",16) == "10") {
print '(´ε` )チュッ';
}
クソが。
なるほどねー。
ただでさえ文字列同士の比較なのにintに変換されるだけでもミソ糞うぜぇのに、わざわざ16進数の場合は10進数に変換してくれる超糞尿仕様。
文字列同士の比較であってもintに自動変換してくれるだけでも素晴らしいのに、それに加えて16進数の場合は10進数に変換してくれる超便利仕様。
ってこたぁ、8進数表記の場合も糞糞マジ死ぬほど余計なお世話するんだろうなぁと思ってしぶしぶ試してみた。
ということは8進数表記の場合もこの素晴らしい自動変換しれくるのかなと思って試してみた。
if ("0x0A" == "012") {
print '(´ε` )チュッ';
}
else {
print '\(^o^)/';
}
実行結果
\(^o^)/
おー、さすがPHP!、やっぱ8進数の場合は10進数と似てるから8進数と見なすよりも10進数と見なしたほうが効率いいですもんね。いやーわかってるなー。ますますPHPが好きになりました。I Love PHP. We Love P☆H☆P!
はは、はははっ、ははははっ。やるならやる!やらないならやらない!どっちかに統一せーやこのプリンシパル校長ヘッドハンティンピープルぺーぺーぽりんき味噌マッチョ変態改造エアガン陵辱-2くらいのスカンク殺ろうがぁああああああ★ああああああああああああああああああああああああああああああああああああああfじょ★えいjfsきじぇいつつしまじいのそるいつのだ★ひろけがきちもするけけけそあいんぼろうれあああぁあああああaaaaaa
例えば下記の擬似コード
i = 1;
while( i & 7 ) {
i++;
}
勘弁して。いや、わかるよ。言いたいことはさ。でも俺こういう書き方慣れてないから脳内で素早く2進数変換できないの。
いや単なるイディオムとして覚えてればいい話ってのはごもっともだけど普段こういう書き方しないからパッと出てこないんだよね。
一応これがいまいちわからない人のために説明すると
i = 1;
while( i < 8 ) {
i++;
}
ってことだから。(厳密に言えば少し違うが、ここでの話はこれで良い)
なんちゅーかさ。条件が10以下とかに変わるだけで破綻するしさ。
ってかもう今時のコンパイラならコレくらいの変換勝手にやってくれるんじゃねーの?(さすがにまだまだ?この辺疎い)
そうであれば速度的は変わらないわけで単純に可読性&拡張性低下させてるだけの存在になるよね。
まあでもこれは基本的なことなんだけど、自分では書かなくても読めるようにはならないといけないってのは真なので文句を言ってるだけじゃ何も変わらない。
もっともっと書いて書いて書きまくろう。
上のような処理は各ビットが全部立ってる場合に有効になるので算出方法としては
(1 << x) - 1
となる。
つまり2の累乗から1引くと各ビットが立った数値となるわけなのです
10進数 2進数 1 00000001 3 00000011 7 00000111 15 00001111 31 00011111 63 00111111 127 01111111 :
ビットが全部立ってる数値を&で評価すると、その値を一つ超える数値、すなわち2の倍数が来るまでは常に真となるわけですね。
先ほどの処理で言うならばこういうことになります。
i & 7 = x (1)00000001 & (7)00000111 = 00000001 (2)00000010 & (7)00000111 = 00000010 (3)00000011 & (7)00000111 = 00000011 (4)00000100 & (7)00000111 = 00000100 (5)00000101 & (7)00000111 = 00000101 (6)00000110 & (7)00000111 = 00000110 (7)00000111 & (7)00000111 = 00000111 (8)00001000 & (7)00000111 = 00000000
という感じでiが8になった時点で7との論理演算の結果が偽となるため、ループが終了します。
正直スクリプト系言語から入るとこういう低レベルな計算を行うことは殆どないし、逆にこういうコードを書いてると先輩から怒られます。
なので自分で学ばない限りなかなかこれらのコードを直に理解できる状態にはならないので注意が必要です。
コードというのは「書けなくても、書かなくても、読めなければならない」これ鉄則。
1はこのへん
http://anond.hatelabo.jp/20090217112022
あ、い、う…に1,2,3…を当てはめることを考えてみる。あいうえおかきくけこ、で数を表す事ができる。256なら「いおか」である。
しかし…日本語にはもっと多数の音があるので、これだけではもったいないのではないか。となるとどうすべきか。
適当に…
|あ~/か~ が~/さ~ ざ~/た~ だ~/な~ は~/ば~|
|あっ~/かっ~ がっ~/さっ~ ざっ~/たっ~ だっ~/なっ~ はっ~/ばっ~|
とでもすれば01~99、00を割り当てる事が出来る。いやまあ適当なんでだいぶ不恰好だが。
例えば5319万6220が「うっせぐっざ」だけで表現できる。…いやまあ不恰好だが。そんでもって数と文字との変換も慣れないといけないが。
それと0007みたいな数など人に話すと場が凍るような場合もありえる。
とはいえもっと工夫すれば、ドラクエ2の52文字だったかの呪文を暗記する人も多い日本人である、大量の桁も少しは扱いやすくなるのではなかろうか。
加えてまだまだ日本語には他にも音があるし、数のほうも10進数に限らなくてもいいわけだ、変換テーブルさえ作り直せられれば。
99も81パターンの三文字で表す事ができる。日本の国債の額も8文字あれば足りる…のかな。ならば1円単位で易く覚えられるだろう。
眠くなってきたので文章としてはグダグダのまま唐突に終わる。
円周率3.14 15 92 65…:うげごひっごっ…
(おまけ:まあ古来にはイロハもあるわけだが、47+1しかないし…)
『本人がプログラミングをして、何をしたいかによる』
そっからは、やれC言語だ、やれActionScriptだJavaScriptだ。ってやっていけばいい。
例えば、ゲーム作りたい!っていう奴がいるとする。
それで、まず最初はC言語だからねーって言ってscanfとprintfで電卓を作らせる。
これで感激して、もっと勉強したい!覚えたい! って、なるのか。
なればいいよ。でも多分ならないだろー
情報処理の教科書みたいに、10進数から2進数へ変換するプログラム書きましょーって。出来るけど、そいつにとって何が面白いのよ。
C言語は確かに基礎だけど、ifとかforを基礎というならJSでもいいし、ポインタやらメモリ管理って言っても、本当にそれは必要なの?
それはC言語にとっての基礎で、シューティングゲームをASとかで作る時は最初に覚える必要はないよね。
なにかしら目標もって、それを実現するために勉強していって、自分のスキルが上がっていくのが分かるからモチベーションに繋がる。
そいつにとって、C言語は目標までのトンネルが長すぎる。出口が遠すぎて目の前が真っ暗。
プログラミングの歩き方をよく分かっていない初心者。早く画面でいろんな動きが見たい!という初心者が、トンネルの出口までたどり着くのは難しい。
それなら、10行で早押しゲームが出来る言語から始めるべき。JSとかが楽かな。他にそういうのがあればそれでいい。
初心者にとっての丸写しじゃない10行は、エキスパートからみる500行と同じ。書いてる時の気分は。
自分の書いたコードが画面に色をつけて、クリックしたら反応する!!
でもクリックしても文字が変わるだけかー。それならもう一回クリックしたら、別の文字になるようにしてみるか。
ならついでに色も変えよう。以下略。
まず『自分でパソコンの画面が動かせる!』ということを実際に体感してみないと。
RPGでも、最初からボス出てきて瞬殺されたらやる気なくすじゃん。最初はユルい敵倒していって、レベルアップしていく。
そのうち勝てない敵が現れるけど、勝ちたいから経験値貯めるんでしょ。
そのうちに、その言語だと絶対不可能なことが出てくるはず。その時にC言語やってポインタ覚えればいい。
今回はゲーム作ってみたいっていうパターンを例にしたからC言語はダメだと言ったけど
コンピューターの動作について理解したいとか、そういうのなら断然C言語かなと思う。
とりあえず、初心者が「プログラミングしたいんだけど、どの言語がいい?」と聞いてきたら、
C言語と答える前に「プログラミングで何をしてみたい?」って聞いてみようよ。
あれ、超越数って実数係数の代数方程式の根じゃない数ではなかったか。
あーでも表記として(abcd)_pのa,b,c,dに無理数が入るのはやっぱおかしくね?
276 名前: 名無し~3.EXE [sage] 投稿日: 2009/02/19(木) 23:52:42 ID:iUVjMFa0
>>92-93
52ですけど、IE8+test16で同時接続数がうpしました。
ありが㌧
あんたスゴイっす。ふつう分かりませんよ。
ちなみに、やったこと。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_MAXCONNECTIONSPERSERVER
と
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_MAXCONNECTIONSPER1_0SERVER
に、
縦書き用(左右五画ずつ)
既畔矩砥砲破祓租祗祠秤称秩
横書き用(上下五画ずつ)
帯益留党畠砦秦泰竜高
イメージ的に問題
畜秘弱眩疲疵疸疹疼疽疾病症眠眩祟被
たぶん認知度に問題
哥哬哿畟夞屔巼唜眔玆砡窊罛瓳瓴瓵甡眚畕畖畗畘畚畛畞畟疍疰疱疳疴疶疷疻疿痀痁痂痃
痄痆痈痉皉皊皋皌皍皰皱破盉盋盌盍盎盏盐监眎眏眐眑眒眓眔眕眖眗眘眙眚眛眜眝眡眢眣
眤眥眦眧眨眪眫眬眿窅矝砝砞砟砠砡砢砣砤砧砨砩砪砫砬砭砮砯砰砱砳砵砶砷砸砹砺砻砼
砽砾砿础硁祏祏祐祑祒祔祕祘祙祚祛祜祡祢神秙秚秛秜秝秞秠秡秢秣秥秧秨秩秫秬秭秮积
窄窅窆窇窈窉窊窋窌窍窎竘站竚竛竝竞罛罜罝罞罟罠罡罢秪
正の代わりにカウントとして使えそうな文字。
追記:「犯」や「正」とかだと五画だから…、よく使う数の体系が十進数なのに半分の五画で一文字を構成してしまうところが不満だったので。十画ならその不満がない。どうせなら十画から選びたい。
追記:って祝神祖は使えないじゃん、示偏の名残か?字体や書き方が変わったからかな。画数票がそのような変化に対応してなかったっぽい。対応してる画数字典ないかな。
年明けに大掃除したら、実家から持ってきた書籍の中に小学生の時に
その中にチラシが入っていたのだが
「お知らせ
本機は日本電信電話公社より認定をうけており、キャプテンユニットMPC-CAP1などの機器との組み合わせで
とか書いてある。
当時はこんなチラシ見もせずにBASICとデーレコばかり操作していたからな。
このチラシが何を意味する物なのか今となっては謎になっている。
それよりも、その他にもBASICマニュアルなんぞ出てきたのだがEOFとかBSAVEとかON SPRITE GOSUBとか理論演算子とか掲載されてる。
おかしいなぁ・・小学生時代にはこれも覚えてスプライトを駆使してマシン語を16進数で作成、3色キャラクタなんぞを作ってBASIC
プログラムを作って遊んだはずなのに。今ではすっかり忘れてしまった・・。
あのままもっと色々とやっていれば勉強できたのかなぁ。
妻がニコニコ動画で、801板がVIP板に完勝したとかいう動画をみて爆笑してた。妻よ、そういうのは私のいない時にこっそり見れ。まあ面白かったけどな。801板の腐女子の方々は、どんな物にも萌えを感じるのだそうだ。
私「そんなの楽勝だろう。まったく何も関係のないもの同士が難しいのでは。そうだな、たとえば、アボガドロ数とミミズ」
私「なぜ?」
妻「なんかクネクネしてて受けって感じだから。『ああっ、そんなにたくさんで責めないで…』」
私「…」
私「それは必ずしも無関係とは言えないのではないか」
妻「なぜ?」
私「魚でニシンっているだろ。『ニシン数はあるのにサンマ数がないなんて、く、悔しいっ』」
妻「それで、どっちが攻めでどっちが受けなの?」
私「知らんがなそんなの」
これは…2進数だ。
これを音声にして、さらに逆音節を調べれば。
「finalvent サイキン カゲ ウスイ」と読める。
いや、2進数でも1+1は2だろ。それを10と表記してるだけで、数としては同じ「2」をさしている。
混在させるときは、たとえば末尾にBとかつけて分かりやすくするほうがいいな。2=10B。
8進数において
a+b+c+d+eが7の倍数のとき
整数abcde
=10000a+1000b+100c+10d+e
は
(7777a+a)+(777b+b)+(77c+c)+(7d+d)+e
=(a+b+c+d+e)+7(1111a+111b+11c+d)
よってa+b+c+d+eが7の倍数のとき8進数abcdeは7の倍数