C#(または一般的なプログラミング)で16進値とバイト値を計算して使用するための基本的な理解が不足しているようです。
文字列やRGBカラーなどのソースから16進値とバイト(0x--)を計算する方法を知りたい(R255 G0 B0の0xコードを理解する方法など)
なぜFFのようなものを使用するのですか、それは基数10のシステムを補正して10のような数を取得するためですか?
16進数は基数16であるため、0から9までカウントする代わりに、0からFまでカウントします。通常、16進定数の前に。を付け0x
ます。したがって、
Hex Dec
-------------
0x00 = 0
0x09 = 9
0x0A = 10
0x0F = 15
0x10 = 16
0x200 = 512
バイトは、コンピューター上の値の一般的なストレージ単位であり、最近のほとんどすべてのシステムでは、バイトには8ビットが含まれています。bit
実際にはを意味することに注意してくださいbinary digit
。したがって、これから、バイトの最大値は11111111バイナリであることがわかります。これは、0xFFの16進数、つまり10進数の255です。したがって、1バイトは最低2つの16進文字で表すことができます。通常の4バイトint
は、のように8桁の16進文字です0xDEADBEEF
。
RGB値は通常、RGBの順に3バイトの値でパックされます。したがって、
R=255 G=0 B=0 => R=0xFF G=0x00 B=0x00 => 0xFF0000 or #FF0000 (html)
R=66 G=0 B=248 => R=0x42 G=0x00 B=0xF8 => 0x4200F8 or #4200F8 (html)
16進計算では、計算機としてPythonを使用するのが好きです。
>>> a = 0x427FB
>>> b = 700
>>> a + b
273079
>>>
>>> hex(a + b)
'0x42ab7'
>>>
>>> bin(a + b)
'0b1000010101010110111'
>>>
RGBの例では、ビットシフトを使用してこれらの値を簡単に計算する方法を示すことができます。
>>> R=66
>>> G=0
>>> B=248
>>>
>>> hex( R<<16 | G<<8 | B )
'0x4200f8'
>>>
Base-16(16進数とも呼ばれます)表記は、正確に1つの16進数に4ビットを収めることができ、バイナリへの変換を非常に簡単にし、完全な2進数表記ほど多くのスペースを必要としないため便利です。これは、ビット指向のデータを人間が読める形式で表現する必要がある場合に役立ちます。
16進数の学習は簡単です。必要なのは、16進数から2進数への変換を定義する16行の短いテーブルを記憶することだけです。
0 - 0000
1 - 0001
2 - 0010
3 - 0011
4 - 0100
5 - 0101
6 - 0110
7 - 0111
8 - 1000
9 - 1001
A - 1010
B - 1011
C - 1100
D - 1101
E - 1110
F - 1111
この表があれば、任意の長さの16進文字列を対応するビットパターンに簡単に変換できます。
0x478FD105 - 01000111100011111011000100000101
逆変換も簡単です。2進数を4でグループ化し、表を使用して16進数を作成します。
0010 1001 0100 0101 0100 1111 0101 1100 - 0x29454F5C
10進数では、各桁は右の桁の10倍の重みが付けられます。たとえば、32の「3」は3 * 10で、102の「1」は1*100です。 2桁(0と1)の各ビットは、右側のビットの2倍の重みしかありません。16進数は16桁を使用します。10進数の10桁と、A=10からF=15の文字を使用します。
n桁の10進数は、最大10 ^ n -1の値を表すことができ、同様に、n桁の2進数は、最大2 ^n-1の値を表すことができます。
2 ^ 4 = 16の可能な値を4ビットで表すことができるため、1つの16進数を4ビットで表すことができるため、16進数は便利です。
一度に右の4ビットからグループ化し、各グループを対応する16進数に変換することにより、2進数を16進数に変換できます。例:1011100->(101)(1100)-> 5C
各16進数を対応する2進数に単純に展開できるため、16進数から2進数への変換はさらに簡単です(例:0xA4-> 1010 0100)。
投稿された実際の質問に対する答え(「なぜFFのようなものを使用するのですか、基数10のシステムを補正して10のような数値を取得するのですか?」)は次のとおりです。コンピューター使用ビット、つまり1または0。
本質は、リーが投稿して「位取り記数法」と呼んだものに似ています。10進数では、数値の各位置は10の累乗を表します。たとえば、数値123では、最後の位置は10^0を表します。真ん中の位置は10^1-十を表します。そして最初は10^2-数百です。したがって、数値「123」は1 * 100 + 2 * 10 + 3 * 1=123を表します。
2進数の数値は同じシステムを使用します。数値10(ベース2)は、1 * 2 ^ 1 + 0 * 2 ^ 0=2を表します。
10進数の10を2進数で表現する場合は、数値1010を取得します。つまり、1つの10進数を表すには4ビットが必要です。
ただし、4ビットを使用すると、10個の異なる値だけでなく、最大16個の異なる値を表すことができます。1桁あたり4ビットが必要な場合は、基数10だけでなく、基数16の数値を使用することもできます。ここで16進数が役立ちます。
ARGB値の変換方法について。他の返信に書かれているように、2進数と16進数の間の変換は比較的簡単です(4桁の2進数= 1桁の16進数)。
10進数と16進数の間の変換はより複雑であり、少なくとも私にとっては(頭の中で行う必要がある場合)、最初に10進数を2進数表現に変換し、次に2進数を16進数に変換する方が簡単です。グーグルはおそらくそのためのハウツーとアルゴリズムをたくさん持っています。