32、64、128 などの 2 進数がコードで使用されているかなりの数の例を見てきました (たとえば、非常によく知られている例 - マインクラフト)。
Java / C++ などの高水準言語で 2 進数を使用すると、何か効果がありますか?
私はアセンブリを知っており、レジスタ制限を超えると低レベル言語では物事が複雑になりすぎるため、常にこれらを使用することをお勧めします。
2 進数を使用すると、プログラムの実行速度が速くなり、メモリが節約されますか?
ほとんどのものと同様に、「場合によります」。
コンパイルされた言語では、より優れたコンパイラーは、低速のマシン命令が別の高速のマシン命令で実行できる場合があると推測します (ただし、2 の累乗などの特別な値の場合のみ)。コーダーはこれを知っていて、それに応じてプログラムすることがあります。(たとえば、2 の累乗を掛けるのは安価です)
また、アルゴリズムが 2 のべき乗を含む表現に適している場合もあります (たとえば、高速フーリエ変換やマージ ソートなどの多くの分割統治アルゴリズム)。
また、ブール値を表す最もコンパクトな方法 (ビットマスクなど) の場合もあります。
それに加えて、メモリの目的でより効率的な場合もあります (通常、ロジックを 2 の累乗で乗算および除算するのは非常に高速であるため、OS/ハードウェア/etc はキャッシュライン/ページサイズなどを使用します。 2 であるため、重要なデータ構造には 2 の累乗のサイズを使用することをお勧めします)。
それに加えて、プログラマーは 2 のべき乗を使用することに慣れているため、2 の累乗が適切な数に思えるため、単純に使用します。
いいえ、使用する番号に関係なく、コードは同じように実行されます。
2進数で、2の累乗の数値を意味する場合:2、4、8、16、1024 ....通常、スペースの最適化のために一般的です。たとえば、8ビットのポインタがある場合は256(つまり、2の累乗)のアドレスを指すことができるため、256未満を使用すると、ポインタが無駄になります。通常、256バッファを割り当てます。 ...これは2つの数の他のすべての累乗に対しても機能します...。
プログラムで 2 の累乗を使用すると、いくつかの利点があります。ビットマスクは、主にビット単位の演算子 ( &
、|
、<<
、>>
など) が信じられないほど高速であるため、これの 1 つのアプリケーションです。
C++ と Java では、特に GUI アプリケーションで、これがかなり行われます。32 の異なるメニュー オプション (サイズ変更可能、取り外し可能、編集可能など) のフィールドを用意し、値を複雑に追加することなくそれぞれを適用できます。
生のスピードアップまたはパフォーマンスの向上に関しては、それは実際にはアプリケーション自体に依存します. GUI パッケージは非常に大きくなる可能性があるため、メニュー/インターフェイス オプションを適用する際に高速化することは大きなメリットです。
それらが使用される理由はおそらく異なります-たとえば、ビットマスク。
それらを配列サイズで見ると、実際にはパフォーマンスが向上しませんが、通常、メモリは 2 の累乗で割り当てられます。たとえば、 と書いchar x[100]
た場合、おそらく 128 バイトが割り当てられます。
ほとんどの場合、答えはノーです。顕著なパフォーマンスの違いはありません。
ただし、配列/構造体のサイズ/長さに 2 進数を使用しないとパフォーマンスが大幅に向上する場合があります (非常にまれです)。これらは、キャッシュをいっぱいにしている場合であり、配列/構造をループするたびにキャッシュの衝突が発生するような方法でキャッシュをいっぱいにする構造をループしているためです。このケースは非常にまれであり、コードの実行が理論上の制限よりもはるかに遅いという問題がない限り、事前に最適化するべきではありません。また、このケースはハードウェアに大きく依存しており、システムごとに異なります。
質問のタイトルからすると、「バイナリで定数を書くとプログラムが効率化されますか?」という意味のように聞こえます。それがあなたの言いたいことであるなら、答えははっきり言っていいえです。コンパイラはコンパイル時にすべての定数をバイナリに変換するので、プログラムが実行されるまでには違いはありません。コンパイラが 2 進定数を 10 進定数よりも速く解釈できるかどうかはわかりませんが、その違いは些細なことです。
しかし、あなたの質問の本文は、必ずしも2進数で表現するのではなく、「2進数で丸められた定数を使用する」ことを意味しているようです。
ほとんどの場合、答えはノーです。たとえば、コンピューターが 2 つの数値を加算する必要がある場合、たまたま 2 進数で丸められた数値を加算しても、丸められていない数値を加算するよりも速くはなりません。
乗算のほうが少し速いかもしれません。一部のコンパイラは、2 の累乗による乗算をハードウェア乗算ではなくビット シフト操作に変換するほどスマートであり、通常、ビット シフトは乗算よりも高速です。
アセンブリ言語の時代には、配列内の要素のサイズを 2 の累乗にすることがよくあったので、乗算ではなくビット シフトを使用して配列にインデックスを付けることができました。しかし、高水準言語では、プリミティブがメモリ内でどれだけのスペースを占めるか、コンパイラがそれらの間にパディングバイトを追加するかどうかなどを調べるために調査を行う必要があるため、これを行うのは難しいでしょう.配列要素にいくつかのバイトを追加して 2 の累乗にパディングすると、配列全体が大きくなり、余分なページ フォールトが発生する可能性があります。つまり、オペレーティング システムがメモリを使い果たし、チャンクを書き込む必要があります。データをハード ドライブに保存し、必要なときに読み戻します。1 つの余分なハード ドライブの権利には、1000 回の乗算よりも多くの時間がかかります。
実際には、(a) 違いは非常に些細なものであり、心配する必要はほとんどありません。(b) 通常、低レベルで起こっていることすべてを知っているわけではないため、意図的な影響を伴う変更が役立つか害になるかを予測するのは難しい場合がよくあります。
要するに:気にしないでください。問題に自然な定数値を使用します。