Почему C не имеет двоичных литералов?
Я часто хотел бы сделать что-то подобное в c:
val1 &= 0b00001111; //clear high nibble
val2 |= 0b01000000; //set bit 7
val3 &= ~0b00010000; //clear bit 5
Наличие этого синтаксиса кажется невероятно полезным дополнением к Си, без каких-либо недостатков, о которых я могу подумать, и это кажется естественным для языка низкого уровня, где бит-тиддлинг довольно распространен.
Изменить: я вижу некоторые другие отличные альтернативы, но они все разваливаются, когда есть более сложная маска. Например, еслиreg
это регистр, который управляет выводами ввода / вывода на микроконтроллере, и я хочу установить выводы 2, 3 и 7 одновременно с возможностью записиreg = 0x46;
но мне пришлось потратить 10 секунд на обдумывание (и мне, вероятно, придется тратить 10 секунд снова каждый раз, когда я читаю этот код после того, как я не смотрю на него в течение дня или двух), или я мог написатьreg = (1 << 1) | (1 << 2) | (1 << 6);
но лично я думаю, что это намного менее понятно, чем просто написать `reg = 0b01000110; ' Я могу согласиться с тем, что он не масштабируется за пределы 8-битной или, возможно, 16-битной архитектуры. Не то чтобы мне когда-либо нужно было делать 32-битную маску.