有没有办法在GCC二进制文字中进行分组?

时间:2012-12-08 05:28:39

标签: c gcc

我稍微使用寄存器,以及将所有内容转换为位索引的数据表。幸运的是,我正在使用gcc,它具有二进制文字扩展语法,所以我可以做像

这样的事情
register |= 0b01000010;

另一种选择当然是使用十六进制格式

register |= 0x42;

尽管随着时间的推移已经使用了十六进制,但我仍然发现二进制格式更适合这种比特敲击。我仍然将4和2个半字节分解为0100和0010模式。所以我认为二进制格式可视化更好。但是,带有二进制格式的问题是很难找到边界的。使用十六进制格式,半字节很好地分开,因此您可以有时“索引”位更安全。 IOW,在顶部我不得不担心我没有添加或省略额外的0并最终得到第7位而不是6。

我很好奇,如果其他人已经开发出一种技巧/诀窍来吃蛋糕并且也吃掉它。当你必须在C

中相邻的字符串常量
"Hello " "World"

编译器非常聪明,可以将它们拼接成一个文字。如果有办法用这些二进制数做类似的事情会很好,例如

0b0100 0010

我可以用宏做一些奇怪的事,也许是

#define _(a, b) (((a) << 4) | (b))

然后能够做到

_(0b0100,0b0010)

但实际上这更糟糕,仅限于一对小吃。好奇,如果有人想出一些聪明而善良的东西。

1 个答案:

答案 0 :(得分:2)

在C中,您仅限于指定十进制,八进制和十六进制的整数常量。或者组合移位常数组(根据您的问题下方的H2CO3和评论)。如果它对你来说足够重要,你可以将你的符号指定为带引号的字符串常量并调用一个函数(你自己的写作)来转换那个&amp;返回其整数值。您想要指定此类常量的任何位置,只需在其位置调用您的函数... int i = b("0100 1101 0011 1100"); ....或者使用C ++ ....请参阅Binary literals?Can I use a binary literal in C or C++?

如果你编写自己的字符串常量转换器,可以忽略非[0,1]数字,这样你就可以根据你指定的内容以任何方式对这些位进行分组。