7

どの C 互換ライブラリを使用しても、ヘッダーで定義された定数を見ると、常に 16 進数値として定義されています。たとえば、GL/gl.h では次のようになります。

#define GL_POINTS                               0x0000
#define GL_LINES                                0x0001
#define GL_LINE_LOOP                            0x0002
#define GL_LINE_STRIP                           0x0003
#define GL_TRIANGLES                            0x0004
#define GL_TRIANGLE_STRIP                       0x0005
#define GL_TRIANGLE_FAN                         0x0006
#define GL_QUADS                                0x0007
#define GL_QUAD_STRIP                           0x0008
#define GL_POLYGON                              0x0009

この規則には特定の理由がありますか?代わりに単に 10 進数を使用しないのはなぜですか?

4

3 に答える 3

7

考えられる理由はいくつかあります。

1) 各 16 進数は正確に 4 ビットを表すため、ビット フラグは 16 進数として表現する方がはるかに簡単です。

2) 明示的にビット フラグではない値の場合でも、16 進数として記述した場合により明確になる意図的なビット パターンが存在することがよくあります。

たとえば、すべての AlphaFunctions は 0x02 で始まり、1 バイトのみが異なります。

#define GL_NEVER                          0x0200
#define GL_LESS                           0x0201
#define GL_EQUAL                          0x0202
#define GL_LEQUAL                         0x0203
#define GL_GREATER                        0x0204
#define GL_NOTEQUAL                       0x0205
#define GL_GEQUAL                         0x0206
#define GL_ALWAYS                         0x0207

3) 16 進値には先行ゼロを使用できるため、値を並べやすくなります。これにより、読み取り (および校正) が容易になります。16 進リテラルと 8 進リテラルでは先行ゼロが許可されているのに 10 進リテラルでは許可されていないことに驚かれるかもしれませんが、C++ の仕様では、

10 進整数リテラル (基数 10) は、0 以外の数字で始まり、一連の 10 進数で構成されます。

于 2012-07-13T22:45:04.733 に答える
2

定数値がビットフラグを参照し、組み合わせることが意図されている場合、16進表記は、どのビットが表されているかを表示する便利な方法です。

たとえば、Boostヘッダーから:

// Type encoding:
//
// bit 0: callable builtin
// bit 1: non member
// bit 2: naked function
// bit 3: pointer
// bit 4: reference
// bit 5: member pointer
// bit 6: member function pointer
// bit 7: member object pointer

#define BOOST_FT_type_mask                            0x000000ff // 1111 1111 
#define BOOST_FT_callable_builtin                     0x00000001 // 0000 0001
#define BOOST_FT_non_member                           0x00000002 // 0000 0010
#define BOOST_FT_function                             0x00000007 // 0000 0111
#define BOOST_FT_pointer                              0x0000000b // 0000 1011
#define BOOST_FT_reference                            0x00000013 // 0001 0011
#define BOOST_FT_non_member_callable_builtin          0x00000003 // 0000 0011
#define BOOST_FT_member_pointer                       0x00000020 // 0010 0000
#define BOOST_FT_member_function_pointer              0x00000061 // 0110 0001
#define BOOST_FT_member_object_pointer                0x000000a3 // 1010 0001
于 2012-07-13T22:25:47.370 に答える
0

短いですが、もっと重要なのは、それらがビットフラグである場合、それらを組み合わせてマスクを作成する方が簡単です。

于 2012-07-13T22:26:37.683 に答える