17

ほとんどのコンピュータ プログラミング言語で、10 進数や 16 進数のように 2 進数を使用できないのはなぜですか?

  • VB.NET では &H4 のような 16 進数を書くことができます。
  • Cでは、0x04のような16進数を書くことができます

2進数を許可しないのはなぜですか?

  • &B010101
  • 0y1010

ボーナス ポイント!... 2 進数を使用できる言語は?


編集

わお!- つまり、大多数は簡潔さのせいだと考えており、貧弱な古い「波」はバイナリ表現の技術的側面のせいだと考えています。

4

20 に答える 20

33

16 進数 (まれに 8 進数) のリテラルはよりコンパクトであり、それらを使用する人は通常、2 進数を解読するよりも 16 進数と 2 進数の間で高速に変換できるためです。

Python 2.6+ではバイナリ リテラルが許可されており、Ruby とJava 7でも同様であり、アンダースコアを使用してバイト境界を明確にすることができます。たとえば、16 進値は次の0x1b2aように記述できるようになりました0b00011011_00101010

于 2009-01-27T15:08:11.567 に答える
10

C++0x では、ユーザー定義リテラルの 2 進数がサポートされます。それが標準の一部になるかどうかはわかりませんが、最悪の場合、自分で有効にすることができます。

int operator "" _B(int i);

assert( 1010_B == 10);
于 2009-01-27T15:08:39.413 に答える
8

ビット表現が意味を持つためには、それを解釈する方法を知る必要があります。使用している 2 進数の種類 (符号付き/符号なし、2 の補数、1 の補数、符号付きの大きさ) を指定する必要があります。

2 進数を適切にサポートする唯一の言語は、ハードウェア記述言語 (Verilog、VHDL など) です。それらはすべて、バイナリで入力された数値がどのように扱われるかについて、厳密な (そしてしばしば混乱する) 定義を持っています。

于 2009-01-27T19:40:00.333 に答える
6

perldoc perlnumberを参照してください:

NAME
   perlnumber - semantics of numbers and numeric operations in Perl

SYNOPSIS
       $n = 1234;              # decimal integer
       $n = 0b1110011;         # binary integer
       $n = 01234;             # octal integer
       $n = 0x1234;            # hexadecimal integer
       $n = 12.34e-56;         # exponential notation
       $n = "-12.34e56";       # number specified as a string
       $n = "1234";            # number specified as a string
于 2009-01-27T16:38:17.267 に答える
5

少しトピックから外れていますが、GCC の新しいバージョンでは、バイナリ リテラルを許可する C 拡張機能が追加されました。したがって、GCC でのみコンパイルする場合は、それらを使用できます。ドキュメントはこちらです。

于 2009-01-27T19:41:53.590 に答える
3

Common Lisp では、#b... (2 の最大乗から最小乗までのビット) を使用して 2 進数を使用できます。ほとんどの場合、頭の中で 16 進数と 2 進数を簡単に変換できるので (#x... を使用して) 16 進数を使用するのが少なくとも同じくらい便利です。

于 2009-01-27T15:19:15.693 に答える
2

16 進数と 8 進数は、バイナリを記述するための短い方法です。コードで定義された 64 文字の long 定数が本当に必要ですか?

于 2009-01-27T15:06:54.300 に答える
2

int の 32 ビットなど、2 進数の長い文字列は難しすぎて便利に解析および操作できないというのが一般的な考えです。Hex は一般的に簡単だと考えられていますが、私は好みを開発するのに十分なほど使用していません。

Ruby は、既に述べたように、 _ をリテラルに自由に挿入できるようにすることでこれを解決しようとします。たとえば、次のようにします。

irb(main):005:0> 1111_0111_1111_1111_0011_1100
=> 111101111111111100111100
于 2009-01-27T15:25:14.217 に答える
2

D は、構文 0[bB][01]+ を使用するバイナリ リテラルをサポートします (例: 0b1001)。また、数値リテラルに _ 文字を埋め込んで読みやすくすることもできます。

于 2009-01-27T15:29:21.727 に答える
2

C では、基数として 8、10、または 16 のネイティブ サポートしかありませんが、実際には、8 ビットの 2 進数を非常に簡単に読みやすくするプリプロセッサ マクロを作成することはそれほど難しくありません。

#define BIN(d7,d6,d5,d4, d3,d2,d1,d0)                      \
(                                                          \
    ((d7)<<7) + ((d6)<<6) + ((d5)<<5) + ((d4)<<4) +        \
    ((d3)<<3) + ((d2)<<2) + ((d1)<<1) + ((d0)<<0)          \
)
int my_mask = BIN(1,1,1,0, 0,0,0,0);

これは C++ でも使用できます。

于 2009-12-15T14:57:40.513 に答える
2

Java 7 では、バイナリ リテラルがサポートされるようになりました。したがって、単純に 0b110101 と書くことができます。この機能に関するドキュメントはあまりありません。私が見つけることができた唯一の参照はhereです。

于 2009-10-29T15:02:41.043 に答える
1

記録のために、そしてこれに答えるために:

ボーナス ポイント!... 2 進数を使用できる言語は?

Specman (別名 e) では 2 進数を使用できます。正直なところ、汎用言語とは言えません。

于 2009-01-27T15:31:21.240 に答える
1

すべての言語はバイナリ リテラルをサポートする必要があります。私はそれらを持っていないと気が狂います!

ボーナス ポイント!... 2 進数を使用できる言語は?

Iconでは、2 から 16 まで、場合によっては 36 までの任意の基数のリテラルを使用できます (私の記憶はぼやけています)。

于 2009-08-08T02:47:51.500 に答える
0

16進数はそれほど冗長ではなく、2進数で表現できるものなら何でも表現できます。

本当に必要な場合、Rubyは2進数を適切にサポートしています。0b11011など。

于 2009-01-27T19:27:06.287 に答える
0

Smalltalkでは2r1010のようなものです。36程度までの任意のベースを使用できます。

于 2009-01-27T18:33:39.670 に答える
0

読みやすさと使いやすさの観点から、16進数表現は2進数を定義するためのより良い方法のようです。彼らがそれを追加しないという事実は、おそらくより多くのユーザーが技術的な制限を必要としていることです。

于 2009-01-27T16:22:53.677 に答える
0

Forthは、常に任意の基数の数を使用できるようにしてきました(もちろん、CPUのサイズ制限まで)。バイナリを使用したい:2 BASE !8進数:8 BASE !など。時間で作業したいですか?60 BASE !これらの例はすべて、基本セットから小数点以下10桁まで入力されています。基数を変更するには、現在の基数から目的の基数を表す必要があります。2進数で、10進数に戻したい場合は、機能し1010 BASE !ます。ほとんどのForth実装には、、、、、などの共通のベースにシフトするための「単語」がDECIMALあります。HEXOCTALBINARY

于 2010-10-06T13:47:49.770 に答える
0

直接的ではありませんが、ほとんどの言語は文字列を解析することもできます。Java はメソッドで「10101000」を int に変換できます。

これが効率的かどうかではありません...そこにあると言っているだけです。静的初期化ブロックで実行された場合、コンパイラによってはコンパイル時に実行されることもあります。

バイナリが得意な場合は、短い数値であっても、0x3c を 4 つの 1 の後に 2 つのゼロが続くように見るのは非常に簡単ですが、バイナリの短い数値でも 0b111100 になるため、確認する前に目を痛める可能性があります。の数の。

0xff9f は、正確に 4+4+1 の 1、2 つのゼロ、および 5 つの 1 です (一見すると、ビットマスクは明らかです)。0b1111111110011111 を数えようとすると、もっといらいらします。

問題は、言語設計者が常に 16 進数/8 進数/2 進数などに多額の投資をしており、このように考えていることだと思います。あなたが経験の浅い人なら、これらの変換がどのように明白ではないかを完全に理解できます.

ねえ、基数変換について考えているときに思いついたことを思い出します。シークエンス -- 「次の数字」は誰も解けないと思っていたが、実際に解けたので解ける。試してみる:

10
11
12
13
14
15
16
21
23
31
111
?

編集:ちなみに、このシーケンスは、ほとんどの言語(確かにJava)で単一の組み込み関数に連続番号を入力することで作成できます。

于 2009-08-08T01:11:48.370 に答える
0

言語設計者は、2 進数を追加する必要性を十分に認識していなかったと思います。平均的なコーダーは、フラグやビット マスクを処理するときに、2 進数だけでなく 16 進数も解析できます。一部の言語が表現としてバイナリをサポートしていることは素晴らしいことですが、平均するとほとんど使用されないと思います。バイナリですが、C、C++、Java、C# で使用できる場合は、8 進数よりも使用される可能性があります。

于 2009-01-27T16:34:29.207 に答える
0

Pop-11 では、数字 (2 から 32) + コロンで構成されるプレフィックスを使用して、ベースを示すことができます。

2:11111111 = 255

3:11111111 = 3280

16:11111111 = 286331153

31:11111111 = 28429701248

32:11111111 = 35468117025

于 2009-08-08T00:19:27.210 に答える