Dre*_*rew 30 c syntax binary literals
我经常希望我能在c中做这样的事情:
val1 &= 0b00001111; //clear high nibble
val2 |= 0b01000000; //set bit 7
val3 &= ~0b00010000; //clear bit 5
Run Code Online (Sandbox Code Playgroud)
拥有这种语法似乎是C的一个非常有用的补充,没有我能想到的缺点,对于低级语言而言,这似乎是很自然的事情.
编辑:我看到了一些其他很好的选择,但是当有更复杂的面具时它们都会崩溃.例如,如果reg是一个控制微控制器上I/O引脚的寄存器,我想在我写入的reg = 0x46;同时将引脚2,3和7设置为高电平,但我不得不花10秒时间考虑它(而且我每次我在没有看一两天后阅读这些代码时,我可能不得不再花10秒钟,或者我可以写reg = (1 << 1) | (1 << 2) | (1 << 6);但我个人认为这不仅仅是写"reg = 0b01000110;".我同意它不会超出8位或16位架构.不是说我曾经需要制作32位掩码.
Yu *_*Hao 37
根据国际标准的基本原理 - 编程语言 C§6.4.4.1 整数常数
添加二进制常量的提议由于缺乏先例和实用程序不足而被拒绝.
它不在标准C中,但GCC支持它作为扩展名,前缀为0b或0B:
i = 0b101010;
Run Code Online (Sandbox Code Playgroud)
详情请见此处.
Jac*_*ack 15
这就是将十六进制推送到十六进制的内容."... 十六进制表示法的主要用途是计算和数字电子设备中二进制编码值的人性友好表示...... ".它将如下:
val1 |= 0xF;
val2 &= 0x40;
val3 |= ~0x10;
Run Code Online (Sandbox Code Playgroud)
十六进制:
通过一些练习,十六进制和二进制之间的转换将变得更加自然.尝试手动写出你的转换而不是使用在线bin/hex符号转换器 - 然后在几天内它将变得自然(并且因此更快).
旁白:尽管二进制文字不是C标准,但如果使用GCC进行编译,则可以使用二进制文字,它们应该以"0b"或"0B"作为前缀.有关详细信息,请参阅此处的官方文档.例:
int b1 = 0b1001; // => 9
int b2 = 0B1001; // => 9
Run Code Online (Sandbox Code Playgroud)
您可以更清楚地编写所有示例:
val1 &= (1 << 4) - 1; //clear high nibble
val2 |= (1 << 6); //set bit 6
val3 &=~(1 << 3); //clear bit 3
Run Code Online (Sandbox Code Playgroud)
(我已经冒昧地将评论从零开始计算,就像大自然一样.)
您的编译器将折叠这些常量,因此以这种方式编写它们不会有性能损失.这些比0b...版本更容易阅读.
我认为可读性是一个主要问题.虽然是低级别的,但是人类会阅读和维护您的代码,而不是机器.
您是否容易弄清楚您错误输入的内容0b1000000000000000000000000000000(0x40000000),您的真正含义0b10000000000000000000000000000000(0x80000000)?