【问题标题】:Separator to make binary literals look cleaner使二进制文字看起来更清晰的分隔符
【发布时间】:2020-09-18 07:28:06
【问题描述】:

我正在尝试以更简洁的格式编写二进制文字。

我了解可以对整数文字执行以下操作:

int x = 1234_5678_9999;

我认为这适用于二进制文字,所以我尝试了:

uint32_t branch_bitmask = 0b0000_1111_0000_0000_0000_0000_0000_0000;

对于第一个下划线之后的所有内容,这会给我一个“无效的后缀”错误。

是否有下划线的替代方法可以让我以更简洁的方式编写二进制文字:

uint32_t branch_bitmask = 0b00001111000000000000000000000000;

【问题讨论】:

  • 我知道在 C++ 中有 ' 数字分隔符,但我认为标准 C 没有类似的东西,可能有 GCC 扩展,但它不能在所有地方都可移植编译器
  • 不是 c 编程语言。唯一的方法是将其转换为字符串(例如使用 itoa() 函数),然后在输出字符串中插入分隔符。
  • 最后我选择用整数文字替换二进制文件,并将“更干净”但无效的二进制文字放在后面(注释)。

标签: c gcc7


【解决方案1】:

如果您的位数始终相同(在您的示例中为 32),您可以像这样#define 一个宏:

#define BITS32(b1,b2,b3,b4,b5,b6,b7,b8) ( \
  ((b1) << 28) + \
  ((b2) << 24) + \
  ((b3) << 20) + \
  ((b4) << 16) + \
  ((b5) << 12) + \
  ((b6) << 8) + \
  ((b7) << 4) + \
  (b8))

然后这样称呼它:

uint32_t branch_bitmask = BITS32(0b0000,0b1111,0b0000,0b0000,0b0000,0b0000,0b0000,0b0000);

或者您可以更进一步,在宏中使用 ## 来添加 0b

但对我来说,简单的答案一直是使用十六进制,因为一个十六进制数字是 4 位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 2012-08-07
    • 2021-09-04
    相关资源
    最近更新 更多