64

10進数ではなく、16進数で定義された整数定数が表示されることがあります。これは私がGL10クラスから取った小さな部分です:

public static final int GL_STACK_UNDERFLOW = 0x0504;
public static final int GL_OUT_OF_MEMORY = 0x0505;
public static final int GL_EXP = 0x0800;
public static final int GL_EXP2 = 0x0801;
public static final int GL_FOG_DENSITY = 0x0B62;
public static final int GL_FOG_START = 0x0B63;
public static final int GL_FOG_END = 0x0B64;
public static final int GL_FOG_MODE = 0x0B65;

2914の代わりに定義する方が明らかに簡単な0x0B62ので、パフォーマンスが向上する可能性はありますか?私は実際にはそうは思いません。それ以来、それを変更するのはコンパイラの仕事であるはずです。

4

11 に答える 11

72

それは、組織的および視覚的な清潔さのためである可能性があります。基数16では、各桁が正確に4ビットに対応するため、基数16は基数10よりもバイナリとの関係がはるかに単純です。

上記で、定数が多くの数字で共通にグループ化されていることに注目してください。それらが10進数で表されている場合、共通のビットはあまり明確ではありません。代わりに10進数が共通している場合、ビットパターンの類似度は同じではありません。

また、多くの場合、フラグの組み合わせを作成するために定数をビット単位でOR処理できることが望まれます。各定数の値がゼロ以外のビットのサブセットのみを持つように制約されている場合、これは再分離できる方法で実行できます。16進定数を使用すると、各値でゼロ以外のビットが明確になります。

他に2つの合理的な可能性があります。8進数、またはベース8は単に1桁あたり3ビットをエンコードします。次に、各桁に4ビットが必要な2進化10進数がありますが、9を超える桁値は禁止されています。これは、2進数で可能なすべての可能性を表すことができないため、不利になります。

于 2012-06-06T19:07:41.467 に答える
27

「0x0B62の代わりに2914を定義する方が明らかに簡単です」

その特定のケースについてはわかりませんが、多くの場合、そうではありません。

2つの質問のうち:

  • A)2914のビット値は何ですか?
  • B)0x0B62のビット値は何ですか?

Bは、多くの開発者によってより正確に迅速に回答されます。(これは同様の質問にも当てはまります)


0x0B62(4桁の16進数であるため、16ビットの数値を表します)

  • 0のビット=0000
  • Bのビット=1011
  • 6のビット=0110
  • 2のビット=0010

->

0000101101100010

(私はあなたが2914で同じことをすることをあえてします。)


これが16進値を使用する理由の1つであり、別の理由は、値のソースが16進(たとえば仕様の標準)を使用する可能性があることです。

時々私はそれをばかげていると思うことがあります:

public static final int NUMBER_OF_TIMES_TO_ASK_FOR_CONFIRMATION = ...;

ほとんどの場合、16進数で書くのはばかげているでしょうが、そうでない場合もあると思います。

于 2012-06-06T19:09:23.263 に答える
10

たとえば、16進マスクを適用するときの読みやすさ。

于 2012-06-06T19:03:15.260 に答える
9

コードは数値を表すバイト定数を移動するようにコンパイルされるため、10進数と16進数の間にパフォーマンスの向上はありません。

コンピューターは10進数を実行せず、(せいぜい)2進数を実行します。16進数は非常にきれいに2進数にマップされますが、10進数を2進数に変換するには少し作業が必要です。

16進数が優れているのは、関連するアイテムが多数ある場合です。多くのアイテムは類似していますが、わずかに異なります。

// These error flags tend to indicate that error flags probably
// all start with 0x05..
public static final int GL_STACK_UNDERFLOW = 0x0504;
public static final int GL_OUT_OF_MEMORY = 0x0505;

// These EXP flags tend to indicate that EXP flags probably
// all start with 0x08..
public static final int GL_EXP = 0x0800;
public static final int GL_EXP2 = 0x0801;

// These FOG flags tend to indicate that FOG flags probably
// all start with 0x0B.., or maybe 0x0B^.
public static final int GL_FOG_DENSITY = 0x0B62;
public static final int GL_FOG_START = 0x0B63;
public static final int GL_FOG_END = 0x0B64;
public static final int GL_FOG_MODE = 0x0B65;

10進数の場合、多数の異なるが関連する項目にわたるビットの定数領域に「気付く」のは難しいでしょう。

于 2012-06-06T19:04:03.860 に答える
6

大きな数値の場合、16進数で表すと、コンパクトになるため、読みやすくなります。

また、2進数への変換にとって重要な場合もあります。16進数は非常に簡単に2進数に変換できます。一部のプログラマーはこれを行うのが好きで、数値に対してビット演算を行うときに役立ちます。

パフォーマンスの向上については、いいえ、ありません。

于 2012-06-06T19:04:44.003 に答える
6

どちらかと言えば書く0xFFFFFFFF4294967295

最初のものは、すべて1の32ビットデータ型をより明確に表しています。もちろん、多くのベテランプログラマーは後者のパターンを認識し、それが本当の意味であるとこっそり疑っています。ただし、その場合でも、入力ミスなどが発生しやすくなります。

于 2012-06-06T19:59:33.323 に答える
3

16進数は、バイナリ形式に最も近い読み取り可能な形式です。これにより、たとえば多くのビット演算が簡素化されます

于 2012-06-06T19:04:25.193 に答える
3

0xB62は2914に等しい:-)

開発者にとって、定数のビットパターンは、10進数で表示される場合よりも、10進数で表示される場合の方がはるかに簡単です。

この事実により、16進数での表示は、ビットとその位置(たとえば、個々のフラグとして使用される)が関連するAPIで使用される定数に適しています。

于 2012-06-06T19:05:28.763 に答える
3

ああ、でも0xDECAFFは素数(1460959)であり、心地よい紫色(RGB)でもあります。

Colorsの場合、hexの方がはるかに便利です。

FFFFFFは白0000FFは青FF0000は赤00FF00は緑色の関係は数字として見やすいです(ただし、人間の目のガンマと忠実度は物事を捨てる傾向がありますが、無視します純粋な数学的な精度のためのそれらの不便な物理的事実!

于 2013-06-14T21:17:45.373 に答える
2

パフォーマンスの向上はありません。

ただし、これらの定数が下の特定のビットに対応している場合、ほとんどのプログラマーは、16進数(または2進数)を使用して、それを明確で読みやすくします。

たとえば、GL_EXP2には1ビットと0x0800ビット(10進数で2048)の2ビットがオンになっていることが簡単にわかります。2049の10進値は、あまり明確ではありません。

于 2012-06-06T19:03:55.957 に答える
2

ビット関連のアルゴリズムを使用する方が簡単な場合もあります。また、コメントの私のステートメントのように、ビット比較を扱う場合もあります。4ビット(2進数)は1つの16進文字に変換されるため、A3=10100011になります。

また、16進数に慣れていない人は、ポインターを使って何かをしていると思うかもしれませんが、それは楽しいか、単調さを壊すかのどちらかです。

int data = 0xF00D;
if ( val != 0xC0FFEE )
{
   data = 0xDECAF;
}

私は時々それをintのようなものの境界をチェックするために使用します。たとえば、0x7FFFFFFF(0x80000000は多くの場合に機能しますが、0x7F ...の方が安全です)を使用して、最大int境界を取得できます。MAX_INTのような言語がない場合に、非常に高いエラー定数を設定するのに便利です。64ビットの場合は0x7FFFFFFFFFFFFFFFを使用できるため、この手法も拡張できます。AndroidがR.idテーブルのルックアップに0x7___を使用していることに気付くかもしれませ

わかりやすくするために、彼らはそれをやっているに違いない。整数は簡単に使用できますが、16進数に精通している場合は、悪くありません。特定の関数のためにx値を予約しているようです。10進数では、0〜99はエラー、100〜199はその他のエラーなどを実行します。彼らがそれをどのように行っているかは、異なってスケーリングされます。

パフォーマンス面では、コンパイラー(多くのアセンブラーでさえ)が、10進数、8進数、16進数、float、doubleなど、最終的にはすべての形式を2進数に変換するため、実行時に何も得られません。

于 2013-01-03T15:13:41.120 に答える