オクタルはどこで役立ちますか?[閉まっている]


36

PHPのまったく奇妙なバグを見て、20分ほど頭をテーブルにぶつけたところ、8進数に気づきました。<%(*&#> 8進数。

要するに、コードが整列されるように、いくつかのリテラルにゼロをパディングしました。大きな間違いです。オクタルを忘れました。

問題は、ファイルパーミッション以外にオクタルを使用する人はいますか?(個人的には好みですchmod ugo+rwxが、プログラムで生成する必要がある場合は、オクタルを使用すると便利であることを理解しています。)しかし、他の状況では役立ちますか?


16
オプションA:自分を責める。オプションB:世界を責める。オプションC:何かを学んだように笑う。
ジョブ

12
@Petrozza-IMOで8進数を示すために先行ゼロを使用するCスタイルは決して良い選択ではありませんでしたが、それは歴史です。私はAdaがより良い規則の1つを持っていると思う-8進数は8#1234567#、16進数16#abcdef#などと書かれ、先行ゼロは単なる先行ゼロです-2から16までの(少なくとも)有効です、すべてが視覚的に明白で理解しやすいものです。
Steve314

2
元の形式であなたの質問@Petruzaこのサイトのために建設的ではなかった、それが開いたままできるように、それはコミュニティによって改善されました:してくださいよくある質問を参照の人がこれを行うと、なぜ我々はそれを奨励する理由の詳細については、を。その他の質問や懸念がある場合は、質問ではなく、メタディスカッションサイトで質問してください。

11
オプションD:問題に関係なく、「非難PHP」は常に正しい選択です
ケファロポッド14年

2
@ Steve314私は完全に同意します。もう1つの注目すべき例は、Pythonに0o接頭辞が付いている場合です(これは一貫し0x0bいますが、おそらく区別するのが少し難しいでしょう00)。Python 3以降、余分な先行ゼロは、この種のバグを防ぐために構文エラーになります。
5gon12eder

回答:


42

ウィキペディアによると、オクタルは以前ほど一般的ではありません。他の人がすでに述べたように、過去には、システムは16/32よりも8進数で簡単に表される12/24/36ビットワードを使用していましたが、現在、x86およびi64アーキテクチャは16/32/64ビットを使用していますこれは16進数で表現しやすく、8進数ではまったく見苦しい。

ただし、現在の用途は次のとおりです。

最近のプログラミング言語では、ユースケースが不足し、バグが発生する可能性があるため、オクタルをサポートしなくなる場合があります。Eric LippertがTCPLの第3版と第4版でこれを書いたように、C#は例です。

2つの理由により、C#は8進リテラルをサポートしていません。まず、最近では8進リテラルを使用する人はほとんどいません。次に、C#が標準の「先行ゼロが8進数を意味する」形式で8進数をサポートしている場合、潜在的なエラーの原因になります。次のコードを検討してください。

    FlightNumber = 0541;

明らかに、この式は8進リテラルではなく10進リテラルとして意図されています。

関連し、参照と好奇心のためだけに、コード、コンピューターハードウェアの隠された言語には、8進数やその他の数体系に関する優れたわかりやすい説明が55〜63 ページにあります


1
その点については、ユーザー入力を処理するときにJavascriptに注意してください。parseInt(011)==9
ダリエン

3
それはユキとパミアについて本当に興味深いです。16進数の指のカウントは、各指の内側を使用して、次のようにいくつかのバリエーション
-ocodo

@Slomojo -あなたがすることができますあなたの指で99まで数える実際には、...
detly

3
非常に包括的な答えを得るために+1。グレース・ホッパーはかつて彼女が小切手帳のバランスをとるのに苦労したと言った。
マクニール

14
@detly、大きな数字をカウントする必要があることがわかっている場合は、10桁をビットとして使用し、指だけで1024にカウントします(#4、#128、#132を表示する人に注意してください)。
zzzzBov

17

Octalは、約50年前にDigital Equipment Corp.(DEC)や、12ビットワード(PDP-8など)または18や36などの6の倍数(UNIVAC 1108など)を備えたコンピューターで広く使用されていました。 )。私は大学院でPDP-8とUNIVAC 1108の両方を使用しました。両方のマシンの文字は、通常8ビットではなく6ビットを使用していました。

PDP-8命令フォーマット

PDP-8命令フォーマット-ビットは0-> 11の番号が付けられていることに注意してください。ビット0はMSB(最上位ビット)でした。

DECが16ビットPDP-11を発表したとき、彼らはドキュメントで16ビットの代わりに8ビットを使用し続けていました。これはおそらく、Register、Mode、Src / DestなどのPDP-11命令フォーマット内の複数の3ビットフィールドが、8進数としてデコードされるようになったためです。(これを指摘してくれたJohn Strohmに感謝します。)

興味深いことに、モトローラが68000マイクロプロセッサを発表したとき、PDP-11の影響が大きく、命令に同じ3ビットモードとレジスタフィールドが含まれていたため、ドキュメントでは16進数のみを使用することにしました。

PDP-11は8進表記を使用したため、PDP-11に最初に登場したUnixの元の許可コードも8進表記を使用していました。このレガシーはLinuxでも存続し、chmodコマンドは8ビットを使用して3ビットの「rwx」フィールドのそれぞれを指定します。

もう少し雑学-CompuServeは、1980年代から1990年代初頭に広く使用されていたダイヤルアップオンラインサービスであり(AOLに隠れる前)、少なくとも当初はDECミニコンピューターで実行されていました。すべてのユーザーIDは数値であり、ある時点で、8または9が含まれていなかったため、8進数になっていることがわかりました。私の古いCIS IDは70205でした。


1
PDP-11のドキュメントに関するコメントが間違っています。PDP-11には8つのレジスタがありました。R0-R5は汎用レジスターです。R6はスタックポインターで、R7はPCでした。MOV命令は、2つの3ビットレジスタ番号と2つの3ビットアドレッシングモードを取りました。Octalは、レジスタおよびモードフィールドを完全にキャプチャします。(これが事故であったことを強く疑います。)16進数を使用すると、すべてが混乱するでしょう。PUSHとPOPは、R6を使用した単なるアドレス指定モードでした。即時オペランドは、R7を使用したアドレス指定モードでした。
ジョンR.ストローム14年

@ JohnR.Strohm 3ビットレジスタのコメントをありがとう。私はあなたの分析に同意し、私の答えを更新しました。
tcrosley

そこでDECはOCTで働きました。混乱を避けるために、3.32ビットの倍数を使用する必要があります。
ユーザー234461

Unixの許可を8進数とは決して考えなかったのは面白いことです。私は常に、3つの個別の数字が一緒に記述され、それぞれが3つのrwxビットを表すと考えていました。
axl

11

Heathkitは、H-8のフロントパネル、およびフロントパネルソフトウェア(PAM-8と呼ばれる)のアセンブリ言語リストにそれらを使用しました。自分と付き合っているのは知っています。

ここに画像の説明を入力してください

今日、オクタルは非常にまれです。誰もがヘックスを使用しているようです。しかし、数字は依然として8進数の数字のように見え、数字AからFのキーの追加行は必要ありません。


2
H-8の場合は+1。外側は8進数ですが、CPUは8080Aで、すべてバイトでした。フィッガー行きます。
Blrfl

H-11(PDP-11 CPUを搭載)との共通性のために8進数を使用したと思います。
ジェリーコフィン

2
8080には8ビットのバイトがありましたが、命令セットは16進数ではなく8進数で見ると意味がありました。
-RBerteig

6

8進数が使用される理由の1つは、特殊文字を必要としない2の累乗である最大の基数であるためです。つまり、すべての数字は数字になります。16進数(8進数の次の数字)には、数字以外の数字(通常はA、B、C、D、E、F)が必要です。


私はこれが古いことを知っていますが、なぜ数字だけを使用するのが文字を使用するよりも望ましいのでしょうか?
ペトルザ

5

私は毎日8進数を使用しています。ファイルをchmodする必要があるたびに、8進数を使用します(u + r表記より前に日付を付けます...)。文字列内に制御文字を埋め込むたびに、8進数を使用します(はい、16進数を使用できますが、8進数を使用します)。


2
「しかし、8進数は私が使用するもの」の+1 :)
ジョエルファン

5

3にグループ化されたビットの組み合わせを表現する必要がある人。

なぜ誰もがヘックスを使用するのですか?


8進数で表される私の頭の上のもの:

  • 飛行機のモード3Aトランスポンダーによってつぶされたコード
  • ARINC 429アビオニクスバスで見つかった特定の値
  • SCSIアドレス
  • ncursesライブラリ内のキーコード

11
違いは、16進数は半バイトとして「自然」です。2桁の16進数= 1バイト。ただし、バイトを8進数に分割することはできません。
メイソンウィーラー

2
最初の行は明白です。2番目のものは、類似性が乏しい。
back2dos

3
また、hexは、前述のUnixファイルモードのように3ビットのグループで表現する必要があるものにとってはまったく不自然です。特定のナンバリングシステムの数字がバイトと一致しなければならないという法律はありません。存在する場合、コンピューターに何かをベース10として表現することは、少なくともビットのグループに合わせて調整するベース8よりも悪い習慣になります。
Blrfl

6
典型的な16進文字列は明らかに16進文字列です。8進数ではありません。
ポールネイサン

1
@Blrfl:それでは、これらの言及された「3つのビットのグループで表現する必要があるもの」のうち、正規の例とは別にいくつあるのでしょうか。これが実際の質問であり、これまで答えられていませんでした。代わりに、あなたはさらに別の貧弱な類推を作ります。あり、実際の使用我々は単にそれを処理することを学んだので、10進表現については、。どちらでしょう、あなたがより速く計算しますか?7 * 6または07 * 06?10進数を使用して数値を処理し、16進数を使用して数値を保存します。そして、私たちはこれをたくさん行います。このサイトはその証拠でいっぱいです。
-back2dos

5

CDCメインフレーム(PPU用の60ビットワード、12ビットワード)で作業していたとき、すべてのコアダンプなどは8進数(1ワードあたり20 8進数、PPUワードあたり4)で行われました。


3

16進数と同様に、文字コードを指定するために8進数表記が使用される場合があります。16進数と同じ理由で便利です。16進数はバイナリよりもコンパクトですが、頭の中でバイナリに変換するのは非常に簡単です。


2

16進数のように、8進数は2進数から簡単に変換できます。右側から始めて、2進数を3つのグループにグループ化するだけです。

10010101110  // binary

// conversion
(010)(010)(101)(110)
// so, in octal we have...
(2)(2)(5)(6)
2256

10010101110 (base 2) == 2256 (base 8)

7
これは明らかです。問題はこれが実際にいつ使用されるかについてです。
back2dos

2
@ back2dos:同じコメントを複数回残すのではなく、お気軽に回答を投稿してください。
エドS.

4
@Ed S.質問に答えようともしませんでした。あなたは、元のポスターがほぼ確実にすでに答えを知っていることを明白に言いました。モデレーターが言うのが好きなので、これは私たちが狙っているものではありません。詳細については、meta.programmers.stackexchange.com / questions / 1968 /…を参照してください。
btilly

@ back2dos、btilly-Stackexhangeサイトでの回答は、OPだけのものではなく、合格した読者にとって永続的なリソースになります。すべての明らかな事実は、誰にとっても必ずしも明白ではありません。この答えが価値のある誰かのペニードロップに役立つなら。
オコド

2
@Slomojoはその議論によって、すべての質問はトピックのすべての関連する側面のwikiになる資格があります。ポイントはこれが質問に答えないということです。この答えは、「精神的に8進数にすばやく変換する方法」に対する他のどこかで確かに有効です。
ニコール

2

いや。それらを使用したことはありません。ファイルのアクセス許可を設定する場合でも、そうすることはめったにありません。

そのため、バイナリとの間の変換には明らかな利点があります。
ただし、@ Masonが既に指摘したように、16進数は2バイトで1バイトになるため、16進数ははるかに「自然」です。24/32ビットRGB / ARGBカラー、IPアドレス、バイトマスクなどを表すのに役立ちます。反対側の8進数は、実際には実用的ではありません。3ビットグループで作業するシナリオはめったにないからです。

実際のところ、ファイルの許可だけが私が考えることができるものです。そして、現在のところ使用領域がない場合、そのような領域が存在することはないでしょう。過去20年間のスペースが非常に安価になったため、情報の整理、使いやすさ、拡張性を犠牲にして、情報を非常に密に詰めることは非常に珍しくなりました。


2

ちょっとした話ですが、ロンドン地下鉄での公共利用があります。各列車には、物理​​的なアイデンティティと、運行中に表示されるスケジュール内の個別のアイデンティティの両方があります-こちらをご覧くださいhttps : //upload.wikimedia.org/wikipedia/commons/4/49/LUL-S-Stock-at -Watford.jpg(宛先表示の上部にある402に注意してください)。ディスプレイの電子部品は標準の小数ベースですが、信号システムの従来の8進数ベースのハードウェアに関連付けられているため、数字8または9は表示されません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.