зачем выбирать комплимент при записи в реестр

Каковы преимущества, например, написания первого оператора по сравнению со вторым оператором:

Первое заявление:

ANCON1 = ~0x0C;

Второе утверждение:

ANCON1 = 0xF3;

Я рассматриваю второй вариант как очевидный выбор, который я бы сделал, потому что он более прямолинейный, чем первый. Зачем использовать One Complement, если так просто написать то, что мы хотим.


person Christian    schedule 23.01.2012    source источник


Ответы (5)


Бенуа в значительной степени сказал это. Один - это дополнение, все, кроме этих битов, другой - только эти биты.

something&=~3;

Часто означает, что вы сосредотачиваетесь на этих двух битах, а 0xFC - на других битах. версия ~ отображается непосредственно на немного понятную инструкцию на некоторых платформах, которая, возможно, заставляет автора чувствовать себя лучше, написав ее таким образом. И версия ~ менее подвержена ошибкам и ошибкам, если вы измените размер переменной (не перемещая эти два бита), ваш код все еще будет работать, при использовании 0xFC код будет поврежден, и его нужно касаться везде, где используется переменная. (использование #define для скрытия константы ухудшает отладку. Может быть, лучше, если определение будет использоваться повторно, но ущерб уже нанесен).

В конце концов, это такая же стильная вещь, как

if(!(x&something) {

vs

if((x&something)==0) {

vs

if(x&something) ; else {

На уроках рисования или рисования вас, вероятно, научат сосредотачиваться на негативе, на фоне, рисовать не контур объекта, а контур того, что не является объектом.

В колледже (электротехнике, по крайней мере, десятилетия назад до появления компьютерной инженерии) нас поощряли мыслить в терминах негативной логики. Иногда утвержденное означает положительную логику, иногда отрицательную логику и не мыслить только одним способом. (то же самое касается мышления, что подтверждено или включено - это положительное напряжение, VCC, а отключенное или выключенное - заземление)

В частности, с помощью этой побитовой операции можно читать код в любом случае: «Я обнуляю эти биты» или «Я не обнуляю эти биты». Потому что оба правильные, просто разница в стиле.

Так же «просто» записать 0xC как 0xF3, если вам говорят устно, например, или если в таблице данных указано, что биты [3: 2] - это что-то и то-то, когда ноль. Мозгу не сложно обработать это как 0xC, чтобы обработать его как 0xF3, вам нужно найти дополнительную информацию о длине вещи, а затем обработать биты до и после, прежде чем достигнуть 0xF3. Или вы сделали 0xF3 в уме из 0x0C, и вы могли бы просто использовать ~ 0x0C и сохранить шаг. Если есть диаграмма, показывающая все биты рядом с отмеченными полями, тогда стакан становится наполовину пустым или наполовину полным, вы и ваши глаза можете легко сфокусироваться на негативе и потянуть 0xF3 напрямую или сфокусироваться на 0x0C, а затем инвертировать в получить 0xF3 или сфокусироваться на 0xF3 и нужно инвертировать, чтобы получить 0x0C.

Два преимущества, одно гораздо менее важное, чем другое, заключаются в том, что на некоторых процессорах он напрямую связан с инструкцией, и оптимизатору не приходится работать так усердно (микрооптимизация), второе - это привычка избегать ошибок в программном обеспечении. Если вы использовали int несколько лет назад с 0xFFFFFFF3, а затем скомпилировали этот код сегодня без каких-либо модификаций по сравнению с 64-битной машиной, вы, возможно, столкнулись с ошибкой. если этот метод обычно использовался в коде, то есть еще много работы по переносу. Если бы использовался ~ 0xC, этот код мог бы быть перенесен более плавно. Одно подразумевает размер переменной, другое - нет.

person old_timer    schedule 23.01.2012

Я прочитал первый All but 00001100 и второй 11110011. Мне легче понять, какие биты НЕ устанавливаются мысленно, потому что их меньше.

person Benoit    schedule 23.01.2012
comment
@Mitch Wheat, из любопытства, неправильно ли по-английски говорить «их меньше», говоря о битах, или это просто не идиоматично? - person Benoit; 23.01.2012
comment
Я считаю, что это неверно в данном контексте (но рад, что его исправят!) - person Mitch Wheat; 23.01.2012
comment
Более того, регистр может фактически вести обратный отсчет, как регистры длительности таймера 8-битного Microchip. - person Marco van de Voort; 24.01.2012

Нет никакой разницы, потому что оба значения постоянны, и первое будет подсчитано и оптимизировано для второго вашим компилятором. Используйте тот, который делает код более понятным для вас и других программистов.

Другое дело, если вы использовали переменную для отрицания, а затем для записи переменной в регистр на большинстве микроконтроллеров используются 2 команды, а для записи переменной в регистр используется 1.

person Wookie88    schedule 23.01.2012

Прежде всего, ~ означает поразрядное дополнение. Не путайте это с дополнением, дополнение - это способ перевести шестнадцатеричный формат в целочисленный формат со знаком.

Что касается хорошей / плохой практики, оба ваших примера плохие, потому что они используют «магические числа». Хороший способ написать такой же код - это

#define MASK 0x0C

ANCON1 = ~MASK;

Поскольку MASK - это то, что имеет смысл, а 0xF3 - какое-то случайное магическое число, вы должны использовать первое, а затем инвертировать его.

Обратите внимание, что оператор ~, используемый для целочисленной константы, предварительно обрабатывается во время компиляции. Фактический машинный код по-прежнему будет выглядеть примерно как LOADx $F3.

person Lundin    schedule 23.01.2012
comment
Спасибо за устранение проблемы с комплиментами. Если вы думаете, что эта маска имеет смысл, вы, вероятно, какое-то время занимались программированием и многое понимаете. Может, стоит просто указать 0b11110011 - person Christian; 23.01.2012

Обычно это только вопрос стиля. Первый, x = ~y - это идиома, обычно используемая для обозначения установки всех битов в x, кроме битов в y.

Еще чаще он используется вместе с оператором &=. Например, x &= ~y означает очистить биты в x, которые установлены в y. В этом случае его удобнее писать, например x &= ~0x40, а не x &= 0xFC.

person Lindydancer    schedule 23.01.2012
comment
Спасибо, я сам это заметил и сразу же обновил ответ. - person Lindydancer; 23.01.2012