首页 > 解决方案 > 二进制数和位标志“x”

问题描述

我正在通过一个网站学习 C++ - learncpp.com,我遇到了一行让我感到困惑的代码,我不知道如何研究它。我回去寻找关于它是什么的解释但找不到它,我只是想知道要查找什么或它叫什么,以便我可以了解更多信息。这是代码:

    unsigned char option_viewed = 0x01;

它指的是一个位标志。我感到困惑的是 0x01; 部分。我假设它是十六进制的,但我不确定。谢谢

标签: c++

解决方案


在 C++ 中,您可以用 3 种不同的基数表示整数文字:十进制(基数 10)、八进制(基数 8)或十六进制(基数 16)。以“正常”方式写入的数字(1、13、405、...)被编译器解释为以 10 为底。以 0 开头的数字(01、040、0800、...)被解释为以 8 为底。以 0x 开头的 (0x1, 0x01, 0x800, ...) 被解释为基数 16。

请注意,对于以 16 为基数的数字,您可以在 0x 之后添加任意数量的前导 0。也就是说,0x1、0x01 和 0x00000001 都只是 1。您可能希望包含更多前导 0 的原因是为了对齐代码以提高可读性。正如 John Zwinck 所指出的,人们通常使用十六进制来表示位标志,因为 2 的每个幂都可以用其中一个数字中的 1、2、4 或 8 来写。所以你可能会看到类似

unsigned char red     = 0x01;  // 1 base 10,   00000001 base 2
unsigned char green   = 0x02;  // 2 base 10,   00000010 base 2
unsigned char blue    = 0x04;  // 4 base 10,   00000100 base 2
unsigned char yellow  = 0x08;  // 8 base 10,   00001000 base 2
unsigned char magenta = 0x10;  // 16 base 10,  00010000 base 2
unsigned char cyan    = 0x20;  // 32 base 10,  00100000 base 2
unsigned char white   = 0x40;  // 64 base 10,  01000000 base 2
unsigned char black   = 0x80;  // 128 base 10, 10000000 base 2

实际上每个变量都存储一个数值,但是因为我们使用的是 2 的幂,所以每个值都由一个设置为 1 的不同位表示。由于类型是一个只有 8 位的无符号字符,你永远不会遇到大于 255 的幂,或 0xFF 十六进制,所以 0x 后的两位数就足够了。如果您要存储一个无符号短整数,那么您可能希望将它写为 0x0001,它仍然只是 1,但您很明显它是一个 16 位整数而不是 8 位整数。

您可以在此处阅读有关C++ 中不同数字基数的更多信息。


推荐阅读