【发布时间】:2013-08-17 04:08:30
【问题描述】:
我经常希望我能在 c: 中做这样的事情:
val1 &= 0b00001111; //clear high nibble
val2 |= 0b01000000; //set bit 7
val3 &= ~0b00010000; //clear bit 5
拥有这种语法似乎是对 C 的一个非常有用的补充,没有我能想到的任何缺点,而且对于位旋转相当普遍的低级语言来说,这似乎是一件很自然的事情。
编辑:我看到了其他一些很棒的选择,但是当有更复杂的面具时,它们都会崩溃。例如,如果reg 是控制微控制器上的 I/O 引脚的寄存器,并且我想同时将引脚 2、3 和 7 设置为高电平,我可以写入 reg = 0x46;,但我不得不花费 10 秒考虑一下(在我一两天不看这些代码后,每次阅读这些代码时,我可能不得不再花 10 秒钟)或者我可以写reg = (1 << 1) | (1 << 2) | (1 << 6);,但我个人认为这比只写`reg = 0b01000110;'我可以同意它不能很好地扩展到 8 位或 16 位架构之外。并不是说我需要制作 32 位掩码。
【问题讨论】:
-
它有十六进制,如果你花 10 分钟来感受一下这段关系,我认为它会更好
-
C 有“二进制”文字,但只有 2 个:0、1。;-)
-
物有所值,C++14 will have these。
-
#define B00000000 0#define B00000001 1#define B00000010 2#define B00000011 3...#define B10100100 0xA4... 可能会转换为unsigned char。 -
@AnT:更准确地说,
0是一个八进制常数