Я часто жалея, что я мог бы сделать что-то подобное в C:Почему у C нет бинарных литералов?
val1 &= 0b00001111; //clear high nibble
val2 |= 0b01000000; //set bit 7
val3 &= ~0b00010000; //clear bit 5
Имея этот синтаксис кажется, невероятно полезным дополнением к C без каких-либо недостатков, что я могу думать, и это кажется естественным вещь для язык низкого уровня, где бит-twiddling довольно распространен.
Редактировать: Я вижу некоторые другие отличные альтернативы, но все они разваливаются, когда есть более сложная маска. Например, если reg
является регистром, который управляет выводами ввода-вывода на микроконтроллере, и я хочу установить контакты 2, 3 и 7 в то же время, я мог бы написать reg = 0x46;
, но мне пришлось потратить 10 секунд, думая об этом (и мне, вероятно, придется потратить 10 секунд снова каждый раз, когда я прочитаю этот код после того, как не посмотрю на него в течение дня или двух), или я мог бы написать reg = (1 << 1) | (1 << 2) | (1 << 6);
, но лично я думаю, что это менее понятно, чем просто писать `reg = 0b01000110 ;» Я могу согласиться, что он не масштабируется далеко за пределы 8 бит или, может быть, 16-разрядных архитектур. Не то, чтобы мне когда-либо понадобилось сделать 32-битную маску.
У этого есть шестерка, которая, на мой взгляд, даже лучше, если вы потратите 10 минут, чтобы почувствовать отношения – vroomfondel
Должен ли последний комментарий читать «clear bit 4»? (Или, что еще лучше, «очистить бит 3», поскольку программисты должны рассчитывать с нуля по умолчанию?) – Nemo
ИМХО, потому что есть шестнадцатеричный. Гораздо проще использовать программист, чем двоичные числа. Это очень подвержено ошибкам. Не важно, насколько вы опытны. –