2

我使用了一些寄存器,以及将所有内容都转换为位索引的数据表。幸运的是,我正在使用 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)

但老实说,情况更糟,而且仅限于一小口。好奇是否有人想出了一些聪明又漂亮的东西。

4

1 回答 1

2

在 C 中,您只能以十进制、八进制和十六进制指定整数常量。或组合移位常数组(根据您问题下方的 H2CO3 评论)。如果它对您来说足够重要,您可以将您的内容指定为带​​引号的字符串常量并调用一个函数(您自己编写的)来转换它并返回它的整数值。任何你想指定这样一个常量的地方,只需在它的位置调用你的函数int i = b("0100 1101 0011 1100"); ......或者使用 C++......见二进制文字?我可以在 C 或 C++ 中使用二进制文字吗

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

于 2012-12-08T06:42:51.780 回答