如何将这些十六进制数转换为按位值?

时间:2011-09-09 14:51:52

标签: c bit-manipulation

我正在查看用C编写的项目的源代码。这是一个已定义的选项列表(这些不是真正的定义......不是很具描述性!)

...
#define OPTION_5    32768
#define OPTION_6    65536
#define OPTION_7    0x20000L
#define OPTION_8    0x40000L
#define OPTION_9    0x80000L

我想添加一个新选项OPTION_10但在我这样做之前,我想了解十六进制数字究竟代表什么?

这些数字是否会转换为预期的十进制值131,072 262,144 524,288?如果是这样,为什么不保持与早期选项相同的格式?

5 个答案:

答案 0 :(得分:3)

  

这些数字是否转换为预期的十进制值131,072

是。您可以使用Google进行转换:搜索“0x20000 in decimal”。

  

如果是这样,为什么不保持与早期选项相同的格式?

我想这只是因为程序员知道他们的两个高达65536的权力并且更喜欢十六进制,在那之上它们更容易识别。

L后缀强制输入文字常量至少为long int,但如果需要保持常量,则所选类型可能仍然更大。程序中可能没有必要使用它,因为他/她不理解强调条款。细节详情见C99标准第56页6.4.4.1。

答案 1 :(得分:2)

进一步考虑添加到现有答案中,我更喜欢定义这样的标志:

enum {
    OPTION_5_SHIFT = 15,
    OPTION_6_SHIFT,
    OPTION_7_SHIFT,
    OPTION_8_SHIFT,
    OPTION_9_SHIFT,
    OPTION_10_SHIFT
};

enum {
    OPTION_5 = 1L << OPTION_5_SHIFT,
    OPTION_6 = 1L << OPTION_6_SHIFT,
    OPTION_7 = 1L << OPTION_7_SHIFT,
    OPTION_8 = 1L << OPTION_8_SHIFT,
    OPTION_9 = 1L << OPTION_9_SHIFT,
    OPTION_10 = 1L << OPTION_10_SHIFT
};

这避免了显式计算常量并使插入/删除值等更容易。

答案 2 :(得分:0)

它们代表相同类型的数字,它们都是2的幂。或者,也可以在不同的视角看到它们,它们都是二进制数,只有一个(没有意图)。

他们按照自己的方式编写的一个可能原因(即使原因不是很好)是许多程序员通过hart知道以下序列:

1
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536

此序列对应于前两个的17个幂。然后事情就不那么容易了,所以他们可能会切换到十六进制(懒得改变所有早期的数字)。

答案 3 :(得分:0)

特定值表示位标志选项,可以与按位OR运算符|组合使用:

flags = (OPTION_5|OPTION_6);

您将从这些值的二进制表示中看到每个值都有一个唯一的位集,以允许使用按位OR组合它们:

0x8000L   = 32768   = 00000000 00000000  10000000 00000000
0x10000L  = 65536   = 00000000 00000001  00000000 00000000
0x20000L  = 131072  = 00000000 00000010  00000000 00000000
0x40000L  = 262144  = 00000000 00000100  00000000 00000000
0x80000L  = 524288  = 00000000 00001000  00000000 00000000
0x100000L = 1048576 = 00000000 00010000  00000000 00000000

要查明flags变量中是否设置了标志,可以使用按位AND运算符&

if(flags & OPTION_6)
{
    /* OPTION_6 is active */
}

答案 4 :(得分:-1)

数字的每个数字代表数字数字系统基数乘以数字位数的乘数,从右到左,从零开始计算。

因此32768 = 8 * 10 ^ 0 + 6 * 10 ^ 1 + 7 * 10 ^ 2 + 2 * 10 ^ 3 + 3 * 10 ^ 4。

(为完整性提示:x ^ 0 = 1,x ^ 1 = x。)

十六进制数有16位(0 - 9,A(~10) - F(~15))因此基数为16,所以0x20 = 0 * 16 ^ 0 + 2 * 16 ^ 1。

二进制数有2位数,基数为2,所以100b = 1 * 2 ^ 2 + 0 * 2 ^ 1 + 0 * 2 ^ 0。

知道你应该能够自己计算其余数据并处理二进制和十六进制数字,理解你列出的每个数字是它的前身的两倍,十六进制数字的十进制数值,行中的下一个十进制数字应该是多少,以及如何在任何数值系统中表达OPTION_10,特别是二进制,十进制和十六进制。