10

我似乎缺乏对在 C#(或一般编程)中计算和使用十六进制和字节值的基本理解。

我想知道如何从字符串和 RGB 颜色等来源计算十六进制值和字节(0x--)(比如我如何弄清楚 R255 G0 B0 的 0x 代码是什么?)

为什么我们用FF之类的东西,是为了补偿base 10系统得到10之类的数字吗?

4

4 回答 4

20

十六进制是以 16 为基数的,所以我们不是从 0 到 9,而是从 0 到 F。我们通常在十六进制常量前面加上0x. 因此,

Hex      Dec
-------------
0x00  =  0
0x09  =  9
0x0A  =  10
0x0F  =  15
0x10  =  16
0x200 =  512

字节是计算机上值的典型存储单位,在大多数现代系统中,一个字节包含 8 位。请注意,bit实际上意味着binary digit,因此,我们收集到一个字节的最大值为 11111111 二进制。那是 0xFF 十六进制,或 255 十进制。因此,一个字节至少可以用两个十六进制字符表示。典型的 4 字节int是 8 个十六进制字符,例如0xDEADBEEF.

RGB 值通常包含 3 个字节的值,按 RGB 的顺序排列。因此,

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)

对于我的十六进制计算,我喜欢使用 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'
>>>
于 2012-08-22T21:22:11.627 回答
5

Base-16(也称为hex)表示法很方便,因为您可以在一个十六进制数字中恰好容纳四位,这使得转换为二进制非常容易,但不需要像完整的二进制表示法那样多的空间。当您需要以人类可读的形式表示面向位的数据时,这很有用。

学习十六进制很容易——你需要做的就是记住一个定义十六进制到二进制转换的 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

有了这张表,您可以轻松地将任意长度的十六进制字符串转换为相应的位模式:

0x478FD105 - 01000111100011111011000100000101 

转换回来也很容易:将二进制数字按四分组,然后使用表格生成十六进制数字

0010 1001 0100 0101 0100 1111 0101 1100 - 0x29454F5C
于 2012-08-22T21:23:01.943 回答
1

发布的实际问题的答案(“为什么我们使用 FF 之类的东西,是为了补偿基数为 10 的系统以获得像 10 这样的数字?”)是这样的:计算机使用位,这意味着 1 或 0。

本质类似于李发布的所谓“位置符号”。在十进制数中,数字中的每个位置指的是 10 的幂。例如,在数字 123 中,最后一个位置表示 10^0 -- 那些。中间位置代表 10^1 - 十位。第一个是 10^2——数百个。所以数字“123”代表 1 * 100 + 2 * 10 + 3 * 1 = 123。

二进制数字使用相同的系统。数字 10(以 2 为底)表示 1 * 2^1 + 0 * 2^0 = 2。

如果你想用二进制表示十进制数 10,你会得到数字 1010。这意味着,你需要四位来表示一个十进制数字。

但是使用 4 位,您最多可以表示 16 个不同的值,而不仅仅是 10 个不同的值。如果您需要每个数字四位,则最好使用以 16 为底的数字,而不是仅以 10 为底的数字。这就是十六进制发挥作用的地方。


关于如何转换 ARGB 值;正如其他回复中所写,二进制和十六进制之间的转换相对容易(4 个二进制数字 = 1 个十六进制数字)。

十进制和十六进制之间的转换更复杂,至少对我来说,首先将十进制转换为二进制表示,然后将二进制数转换为十六进制更容易(如果我必须在脑海中进行)。谷歌可能有大量的方法和算法。

于 2012-08-22T21:47:16.220 回答
1

在十进制中,每个数字的权重是右边的 10 倍,例如 32 中的“3”是 3 * 10,而 102 中的“1”是 1 * 100。二进制是相似的,除了因为只有两位数(0 和 1)每个位的权重仅是右边一位的两倍。十六进制使用 16 位数字 - 10 位十进制数字以及字母 A = 10 到 F = 15。

n 位十进制数可以表示高达 10^n - 1 的值,类似地,n 位二进制数可以表示高达 2^n - 1 的值。

十六进制很方便,因为您可以用 4 位表示单个十六进制数字,因为 2^4 = 16 个可能的值可以用 4 位表示。

您可以通过一次从右 4 位分组并将每个组转换为相应的十六进制来将二进制转换为十六进制。例如 1011100 -> (101)(1100) -> 5C

从十六进制到二进制的转换更加简单,因为您可以简单地将每个十六进制数字扩展为相应的二进制,例如 0xA4 -> 1010 0100

于 2012-08-22T21:37:24.000 回答